[转]静态成员函数
因为类的静态成员变量是所有实例共用的.所以得在类外初始化.
调用的时候可以通过对象调用,也可以通过类直接调用
class A
{
public:
int i; //有默认值
};
class B
{
public:
static int n;
static A Aobj;
};
int B::n = 1; //静态成员变量的初始化
A B::Aobj; //静态成员变量的初始化(实例化)
void main()
{
B Bobj;
printf("B::n=%d Bobj.n=%d Bobj.Aobj.i=%d/n", B::n, Bobj.n, Bobj.Aobj.i);
}
私有的静态成员变量也是放在类外初始化的.这看起来跟它的私有属性不相符.
再做下面的测试,发现了一个有趣的现象.
class B
{
static int i;
public:
B(){i=3;}; //把这行注释掉,输出变成0
int p(){return i;};
};
int B::i = 2; //把这行注释掉,编译报错
void main()
{
B Bobj;
printf("private: static int B::i=%d/n", Bobj.p()); //输出3
}
这样看来.类外的初始化那一行根本没有起到初始化的作用.它赋的值根本没用.(对私有静态成员变量是这样.公有的还是有作用的)
于是我的理解是:
静态成员变量的定义一共包括两个部分.
像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.
只是私有的静态成员在类外是不可访问的.于是在类外的赋值语句将不起作用,只起到一个"实现"的作用.
我的理解:私有的静态成员变量在编译 的时候就已经为其分配好内存了,并为其初始化,当用类定义对象的时候,就会调用类的构造函数重新给静态成员变量赋值。
《程序员面试宝典》 p106这样一道题 私有静态成员可以通过公有静态成员函数访问

浙公网安备 33010602011771号