c++中静态成员被当做是该类类型的全部变量,对于非静态成员,每个类都有自己的复制品,而静态成员对每个类都只有一个复制。所以静态成员只有一份,由该类类型的所有对象访问。
如下代码所示,其中sum成员变量使用了static,声明为静态成员变量。这样的话这个变量就是对象obj1和obj2所共享的。所以在定义两个对象的时候,两个对象的构造函数对sum变量的操作,都是操作的同一个变量,而num就是每个对象各自拥有的。因此当输出sum的时候,都是输出的最后一次构造函数调用所赋值给sum的值,而输出的num是各自对象构造函数赋值的值。
#include <iostream>
using namespace std;
class obj{
public:
obj(int a, int b, int c);
void get_number();
void get_sum();
private:
int x;
int y;
int z;
int num;
static int sum;
};
int obj::sum = 0;
obj::obj(int a, int b, int c)
{
x = a;
y = b;
z = c;
num = x + y + z;
sum = x + y + z;
}
void obj::get_number()
{
cout << "num = " << num << endl;
}
void obj::get_sum()
{
cout << "sum = " << sum << endl;
}
int main(int argc, char *argv[])
{
obj obj1(1, 2, 3), obj2(4, 5, 6);
obj1.get_number();
obj2.get_number();
obj1.get_sum();
obj2.get_sum();
while (1);
return 0;
}
结果如下:
与全局的对象相比,静态数据成员的优势:
1.静态数据成员没有进入全局名字空间,不存在程序中其他的全局名字冲突的可能性。
2.使用静态成员可以隐藏信息。因为静态成员可以是private,而全局对象就不能。
需要注意:
1.静态成员变量不能再类中被初始化。
2.静态成员函数不能调用类的非静态成员。就像静态成员变量一样,不属于类的对象,所以就没有this指针。
3.静态数据成员不能受private控制符的作用。
4.静态数据成员可以直接被类名调用。