关于静态数据成员访问的问题?

来源:百度知道 编辑:UC知道 时间:2024/07/04 13:32:34
书上有一段话:如果要通过非静态函数来访问静态数据成员,应该使用非内联函数。同时我看到的程序如下:

#include <iostream>
using namespace std;
class Point
{
public:
Point(int xx=0,int yy=0) {X=xx;Y=yy;countP++;} Point(Point&p);
~Point(){countP--;}
int GetX(){return X;}
int GetY(){return Y;}
void GetC(){cout<<"Object id="<<countP<<endl;}
private:
int X,Y;
static int countP;
};

Point::Point(Point&p)
{
X=p.X;
Y=p.Y;
countP++;
}

int Point::countP=0;
int main()
{
Point A(4,5);
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
A.GetC();
Point B(A);
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
B.GetC();
}

void GetC(){cout<<"Object id="<<countP<<endl;} 中函数体直接放在类体内,是一种内联函数的隐式声明,这不是和书上“该使用非内联函数”的意思矛盾了?

这个Point::countP使用全局初始化的。
在编译时候是在main运行之前就已经初始化了的。
所以即使写在内联函数里面也没关系。

另外,如果没记错的话,书中写的应该是“最好通过非内联函数访问”
之所以这么做的原因是为了避免内联成员在为初始化的时候就被使用了。

但是你看这段程序,全局初始化发生在main之前,
数据直接存储在EXE的数据段了。
所以不会发生初始化之前的访问的。

建议你用断点看看程序运行的顺序就知道了。

但是这是针对这个程序合理,如果程序大了的话,其他编译单元调用静态但远远可能会发生对为初始化变量的访问。
所以最好还是不要写在内联函数中。