静态成员变量
意义:所有对象共享一份数据
特性:编译阶段分配内存
用法:类内声明,类外初始化
注意:
- static成员变量的内存既不是在声明类时分配,也不在分配对象时分配,而是在类外初始化时分配。反过来说,没有在类外初始化的static成员变量不能使用,静态成员变量不占对象的内存。
- static成员变量的空间分配与释放(生命周期)和类的声明、对象的定义都没有关系,但逻辑上是属于类的。
class number
{
public:
int num1;
static int num2;
};
int number::num2=1;
int main()
{
number n1;
n1.num2=19;//对象访问
number::num2=89;//类名访问
}
静态成员函数
- 所有的对象共享一份代码
- 静态成员函数只能访问静态成员变量,否则编译阶段会出错。因为静态成员函数为类本身所有,编译阶段加载。在编译的时候类的静态成员在类加载的时候就已经分配内存,而此时的非静态成员尚未分配内存,访问内存中不存在的东西自然会出错。
- 访问方式
- 像普通成员函数一样用对象来访问
- 可以直接使用类名来访问,必须加作用域访问符::
对象模型
- 一个对象是将普通成员属性与行为分开存放的,每个方法只有一份实例代码
- 在实例化一个对象后,只有普通成员属性才会占对象实际空间,静态成员不占空间
- 原因:每个对象调用方法的时候,代码执行过程都是一样的,所以没必要给每一个对象实例化一份函数。所以函数不占对象的实际空间
讨论:既然每个方法只有一份实例,那方法是如何区分操作对象的?--根据this指针来区分
this指针
- 结论
- 每个普通成员被调用时,都会自动传入一个this指针,该指针指向当前调用该方法的对象
- this指针本质是一个指针常量,所以只想不能改变
person p1;
p1.personinfo();//给personinfo传入this指针,指针指向p1
- 作用
- 解决函数参数与属性重名的问题
- 当方法想要返回对象本身时
- 注意:静态成员方法没有this指针,因为静态成员方法不需要区分对象,所有对象共享一份代码