静态属性
静态成员包括静态成员属性、静态成员函数。
一个属性一旦设置为静态,那么整个程序中就独其一份。
如上所示,之前p.m_A的值是100。使用p2.m_A更改了该值为200后,即使再用p.m_A去调用,结果仍是200。
静态属性会在代码运行前的编译阶段就生成并保持存在全局区。静态属性和静态成员函数都不算在类内,都是保存在别的区域(全局区)。
静态属性必须要有一个初始值,可以在类内声明,类外初始化。
类内声明:
类外初始化:
Person::表示这个变量是在person作用域下的。
写在类的大括号外表示类外,写在其他函数外为全局变量初始化的方式。因此静态全局变量的初始化语句要求既写在类外,也写在函数外。
静态属性的访问方式有两种:使用对象进行访问或通过类名进行访问(这种方式之所以成立是因为静态属性在程序中只存在一个,不管创建哪个对象访问的都是它,同样不用创建对象就可以访问,而普通属性必须得创建一个对象才能访问)
同样的,静态属性也有访问权限的要求。如果是私有的,则不能在其他函数处访问。
静态成员函数
所有的对象共享这一个函数。且静态成员函数只能访问静态成员变量。
静态函数之所以不能访问普通成员属性,是因为静态成员属性不论谁去访问都访问的是那一个。而普通成员属性必须确定访问的是哪个对象的属性,而静态成员属性只有一份,不需要知道是谁在访问他。如下图,对于m_B这个非静态变量,如果现在有两个对象p1、p2,我们就不知道是在调用谁的m_B。
静态成员函数的访问方式也有两种:
第二种方式之所以成立是因为静态属性在程序中只存在一个,不管创建哪个对象访问的都是它,同样不用创建对象就可以访问。
同样,静态成员函数也是有访问权限的。
常成员函数
Const修饰的成员函数称为常函数。常成员函数内不能去更改成员属性。
将一个成员函数设置常函数实质为将函数中的this指针设置为了const,即只能指向常量的指针。如下所示:
这种方式,指针this指向的对象的值也不能被修改了,只能读取。
编译器将这个const加在了这个位置:
常量对象、常量对象的引用或指针只能调用常量成员函数。
如果想在常函数中还能修改变量,应这样定义成员函数:
常对象
这种对象的属性不允许修改。且常对象只能调用常成员函数,这是因为常对象不允许修改属性,而普通成员函数很可能去修改属性。
This指针在默认情况下只能指向非常对象(虽然this本身是常量指针,但其指向的对像不能是常量对象)。
构造函数不能被声明为cosnt类型的。在定义一个const对象时,编译器会先运行构造函数完成初始化工作,再将const的属性赋予该变量。因此,构建const变量的时候可以通过构造函数向其中写值。
C++类的储存
C++编译器会给空对象开辟一个字节大小的空间。这是因为给每个对象都分配一块空间,我们就可以区分这些对象在内存中的位置了。
类虽然对成员函数和属性进行了封装,但是其实是分开存储的。
只有非静态成员属性才会储存在类的对象上,静态属性、静态成员函数、非静态成员函数并不储存在类的对象上。
如果类中包含了内容,则对象所占内存的大小为类内非静态变量属性的所占的大小。
如这种情况,对象所占空间内存大小就是4。之后不论给里面放了多少分静态成员属性和多少成员函数,对象所占空间大小都是4,因为这些内容不会和对象存储在一起。
类内的成员函数和非成员函数均放在代码区,只有实例化对象的时候才会在栈区内为其分配空间。
类的静态成员属性和静态函数在编写定义类的代码时就已经在全局区为其分配好内存了,因此他是属于类的。