静态成员变量和非静态成员变量
写在前面的总结:
静态成员变量是属于类的,就像是你买了一套房,属于固定资产;而非静态成员变量是不属于类的,就像是你租了一套房,主人套房子不属于你,因此,静态成员变量的调用可以直接通过类加域运算符的形式 (CLASS::),而非静态成员变量的调用去只能由实例化的对象,可以理解为租约,有了这个租约,这个房子才能被你用,但也是借用,并不代表房子就是你的了。
(怎么想想还有点心酸呢?)
发现个更好的例子:
静态成员函数是类的成员函数,该函数不属于该类申请的任何一个对象,而是所有该类成员共同共有的一个函数。 举个例子给你,你们班里面有10个人(10个比如高一一班的对象),体育老师分给你们一个篮球(静态成员函数), 你们每个人都带了一个篮球(非静态成员函数),你们都很小气,自己的球只能自己拍,要是5对5打比赛, 那就只能用那个静态的篮球了(每个人都可以拿来用,但是带来的影响是对全体的)。因此,我可以说那个篮球是 高一一班的成员。所以也就是说:静态成员函数是类的成员函数(因为高一二班就不能拿来玩),但是这个篮球最 后还是要还给老师的,任何私人不得占有。希望这样你能明白,其实在机器结构里面说白了静态的成员的内存是唯 一的一份,就是当你在类外声明他时开辟的,但是非静态函数的空间分配是在你实例化对象时创建的。
例如下面这段代码:
#include <iostream>using namespace std;class Student //定义Student类
{public:Student(int n,int a,float s):num(n),age(a),score(s){ } //定义构造函数void total( );static float average( ); //声明静态成员函数private:int num;int age;float score;static float sum; //静态数据成员static int count; //静态数据成员
};void Student∷total( ) //定义非静态成员函数
{sum+=score; //累加总分count++; //累计已统计的人数
}float Student∷average( ) //定义静态成员函数
{ return(sum/count); }float Student∷sum=0; //对静态数据成员初始化
int Student∷count=0; //对静态数据成员初始化int main( )
{Student stud[3]={ //定义对象数组并初始化Student(1001,18,70), Student(1002,19,78),Student(1005,20,98)};int n;cout<<〃please input the number of students:〃;cin>>n; //输入需要求前面多少名学生的平均成绩for(int i=0;i<n;i++) //调用3次total函数{stud[i].total( ); //total属于非静态成员函数,每一次的调用都要具体到某个学生cout<<〃the average score of 〃<<n<<〃 students is 〃<<Student∷average( )<<endl;}//调用静态成员函数return 0;
}运行结果为
please input the number of students:3↙
the average score of 3 students is 82.3333
非静态成员函数的调用要基于某一个实例化的对象;
静态成员函数的调用可以直接用类名加域运算符“::”,也可以用实例化对象名和操作符"."来操作,如 Student a; a.sum;但是用实例化对象进行调用时,也不代表该静态函数或静态变量就属于该对象;
可以理解为静态成员函数是属于类的,因此可以直接用类和域运算符来计算;而非静态成员函数是不属于类的,因此类就不能直接调用,而需要实例化对象之后才能调用;同时,在结构上,静态成员函数没有this指针,而非静态成员函数有this指针,因此静态成员函数不能调用非静态的;
参考: https://blog.csdn.net/zhangjieting/article/details/5930004
静态成员变量和非静态成员变量相关推荐
- 类中的静态成员函数访问非静态成员变量
http://blog.csdn.net/u011857683/article/details/52294353 1.思路: 静态成员函数属于类(通过类访问,调用函数时没有提供this指针), 非静态 ...
- 静态成员变量和非静态成员变量的对比
静态成员变量和非静态成员变量的对比 1.存储的数据 静态成员变量存储的是所有对象共享的数据 非静态成员变量存储的是每个对象特有的数据 2.存储位置 静态成员变量是随着类的加载在方法区的静态区开辟内存了 ...
- 静态变量与非静态变量的区别
静态变量的类型说明符是static,非静态变量反而类型说明符就不是static了.本文主要介绍静态和非静态变量的区别,希望对你有帮助,一起来看. AD: 静态变量:静态变量使用 static 修饰符进 ...
- 线性规划——规范型,标准型,基阵、基本解、基本可行解、基变量、非基变量.... 概念梳理
文章目录 前言 最优化-线性规划 模型问题 线性规划模型的一般形式(min) 线性规划规范形式 线性规划标准型 模型的转换 线性规划中的规律 规范形式顶点的数学描述 标准形式顶点的数学描述 标准形式顶 ...
- C#静态变量和非静态变量的区别
静态变量: •静态变量使用 static 修饰符进行声明 •在所属类被装载时创建 •通过类进行访问 •所属类的所有实例的同一静态变量都是同一个值 •非静态变量: •不带有 static 修饰符声明的变 ...
- c语言非静态成员引用方式,C++中静态成员函数访问非静态成员的实例
C++中静态成员函数访问非静态成员的实例 实现代码: #include /* 静态成员函数只能访问静态数据成员.静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可 ...
- 静态成员变量和非静态成员变量的5个主要区别
1.从保存位置: a) 静态成员变量: 方法区的静态区域 b) 非静态成员变量: 堆内存中的对象空间里面 2.从书写格式上看: a) 静态成员变量: 在数据类型前面多了一个static修饰 b) 非静 ...
- Python的静态成员变量和非静态成员变量
Python中,静态成员变量称为类变量,非静态成员变量称为实例变量. 基本概念 类变量: 类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用.类变量在整个实例化的对象中是公用的. 实例变量: ...
- qt 静态成员变量_Qt 静态成员函数的调用非静态成员变量,非静态成员函数
在多人开发的项目中,一些通用的工具类接口可以用静态成员函数.方便调用,并且不容易调用错误. 静态成员函数不传递this指针(不能->),不识别对象个体,所以经常用于对静态数据成员进行操作.不能操 ...
最新文章
- Data - 数据思维 - 下篇
- 利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件
- apache ant 安装_SAP Hybris使用recipe进行安装时,是如何执行ant命令的?
- tp5 异步处理_tp5.1 swoole 实现异步处理
- 分享.Net 设计模式大全
- 形态数轴的非递进现象
- qq面板(仿版,未完待续中。。。。)---2017-04-24
- 工地上收到北大录取通知书,但他说的这句话更动人!
- LeetCode 63.不同路径II(动态规划)
- C语言/C++常见字符串函数
- Iptables详解之iptables命令的参数
- js压缩文件或文件夹
- 2015年国内数据安全事件盘点
- oracle北京时区,ORACLE中的时区(time zone)
- 20th 【莫队】czy的后宫
- 怎样学手机拼音打字html t=45,在手机上怎么学拼音打字
- python average函数详解_python基础之函数详解
- 2022-2028全球及中国电动汽车充电站和充电桩行业研究及十四五规划分析报告
- __dirname和__filename
- Android支持播mp4的文件管理,Android - 简单使用VideoView播放MP4