一.为什么要有静态成员变量?
全局变量的值为各个函数所共享,各处都可以自由地修改全局变量的值,(全局变量的安全性得不到保证)很有可能失误,从而导致程序错误。
所以为了防止成员变量被随意修改,所以把它设置成静态成员变量来保护它。
二.使用方法
class test
{
private:
static int v; //定义类的静态成员变量
public:
static int getValue() //定义类的静态成员函数
{
return v;
}
};
int test::v = 2024; //类的静态成员变量需要在类外初始化
int main()
{
test t;
cout << t.getValue();
}
特备注意:在初始化静态成员变量的时候要在类外面进行。
三.访问方法
存在两种访问方法:
1.因为它是类的一部分,而不是对象的一部分,所以可以通过类找到它。
2.用类来定义一个对象之后,静态成员变量和静态成员函数也属于对象,所以,也允许通过对象名调用静态成员函数。
class test
{
private:
static int v;
public:
static int getValue()
{
return v;
}
};
int test::v = 2024;
int main()
{
test t;
cout<<test::getValue()<<endl; //直接使用类名+::调用
cout<<t.getValue()<<endl; //使用对象+. 调用
}
四.它为什么没有this指针(静态成员函数)
通常调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋值给函数的this指针。但是静态成员函数它不属于某一个对象,所以它就没有this指针。
1.静态成员函数无法直接访问非静态成员变量(要想访问需要指定对象)。
2.非静态成员函数可以直接访问静态成员变量。
五.初始化时间(静态成员变量)
在编译的时候进行初始化。
编译时初始化的好处:
1.在源代码被编译过程中,编译期会加入代码逻辑,以完成确定的内存分配和变量的初始化。分配内存,并非实际分配内存,而是写入其内存分配大小信息。
2.在编译期初始化,那么在实际运行期都是确定的结构和逻辑,将带来更高的性能,因为编译器完成了一定的工作。
六.内存分配
1.静态成员变量是在所有对象之外单独开辟空间,在一个类中有一个或多个静态成员变量,所有的对象共享这些静态成员变量,都可以引用它。
2.它不随对象的建立而分配空间,也不随对象的撤销而释放。静态成员变量是在程序编译的时候分配空间,直到程序结束才释放空间。