[转]静态成员函数

因为类的静态成员变量是所有实例共用的.所以得在类外初始化.
调用的时候可以通过对象调用,也可以通过类直接调用
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这样一道题   私有静态成员可以通过公有静态成员函数访问

posted @ 2013-08-24 21:43  songnb_7  阅读(183)  评论(0)    收藏  举报