静态数据成员
静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。静态数据成员在定义或说明时前面加关键字static。静态变量的定义静态成员初始化与一般数据成员初始化不同。
静态数据成员初始化的格式如下:
数据类型 类名::静态数据成员名 = 值; //静态变量的初始化
- 静态全局变量:只能在这个文件中可以访问(c中)
- 静态的本地变量:持久的
- 静态的成员变量:在所有对象共享
- 静态的成员函数:在所有对象共享,只能访问静态变量或者静态函数
第一次进f()函数my_x被初始化,有个隐藏的标记来标记它
class X
{
X(int,int);
~X();
};
void f()
{
static X my_x(10,20);
}
静态的对象必须只有一次构造,一次析构,不构造的话也不析构它
全局变量的构造在main函数运行之前构造
类里面的变量成为static会让它在所有对象里的值保持一致
如下的代码,static int i;是声明,所以要在一个cpp的文件里定义这个i,不然对象找不到这个i,且不能写成static int A::i;且静态成员只能在定义的地方初始化
#include <iostream>
using namespace std;
class A
{
public:
A()
{
i = 0;
}
void print()
{
cout << i << endl;
}
void set(int ii)
{
i = ii;
}
~A() {}
private:
static int i;
};
int A::i;
int main()
{
A a, b;
a.set(10);
b.print();
return 0;
}
//结果10
- 静态成员函数
静态的成员函数只能访问静态的成员变量/静态的成员函数,因为其没有this指针
class A
{
public:
A()
{
i = 0;
}
void print()
{
cout << i << endl;
}
void set(int ii)
{
i = ii;
}
~A(){}
private:
static int i;
};
可以在不建立对象的情况下直接访问
#include <iostream>
using namespace std;
class A
{
public:
A()
{
i = 0;
}
static void print()
{
cout << i << endl;
}
void set(int ii)
{
i = ii;
}
~A(){}
private:
static int i;
};
int A::i = 20;
int main()
{
A::print();
}