C++支持静态变量,可以实现多个对象共享数据的目的,使用static修饰。
静态成员变量属于类,不属于某一个对象,在内存中只有一份。静态成员变量或成员函数在声明的时候增加static关键字,定义处不用加static。它不是在声明的时候初始化,也不是在类对象创建的时候初始化,而是在类外进行的初始化,没有在类外进行初始化的静态成员变量不能使用。初始化的时候可以赋值,也可以不赋值,全局数据默认初始化为0,不过按编码规范来说,需要进行初始化赋值操作。static成员变量不占用对象的内存,它是存储在程序的全局数据区内,随程序结束而释放。
静态成员函数只能访问静态成员变量,由于不属于某个对象,所以静态成员函数没有this指针,不创建对象也可以访问,一般使用类::成员的访问方式,例如ClassA::StaticFunc(),当然可以通过对象访问。
this指针的由来:C++的成员函数,由编译器编译后,会成为对象无关的全局函数,会对函数进行重命名,增加特殊字符,称为Name Mangling,是可逆的。不同的编译器,重命名的规则不一样。当成员函数在调用时,不是通过对象去找函数,而且通过函数传递对象,这个隐形的对象指针就是this指针。一般由编译器自动加入到函数第一个参数,是一个const指针,其本质是成员函数的局部变量。这样在调用成员函数的时候,实际是通过this指针进行对象的成员变量访问。一种说法是this指针在对象构造完毕后才会生成,尽量避免在构造函数中使用this指针。
const不能和static同时使用,const成员函数有this指针,static成员函数没有this指针。