class ClassObject {
public:
ClassObject();
virtual ~ClassObject();
private:
int x;
};
int ClassObject::x=10;
为什么编译失败?我认为如果可以通过这种方式初始化静态成员,那么非静态成员也应该可以。
class ClassObject {
public:
ClassObject();
virtual ~ClassObject();
private:
int x;
};
int ClassObject::x=10;
为什么编译失败?我认为如果可以通过这种方式初始化静态成员,那么非静态成员也应该可以。
静态成员是特殊的。一旦定义了类,它们就会分配一个内存。无论我们创建多少该类的对象,所有这些对象都引用同一块内存。
非静态成员不是这种情况。除非您创建该特定类的对象,否则不会为非静态成员分配任何内存,因此尝试以上述方式实例化它们会导致编译器错误。
我猜你的意思是声明用于初始化x
任何 new的值ClassObject
,即你的意思是等同于
ClassObject() : x(10) { }
您的语法问题是编译器需要生成代码来在每个 ClassObject 构造函数中进行初始化;int ClassObject::x = 10;
即,只有在定义所有构造函数的编译单元以及任何隐式生成构造函数的编译单元中都可以进行初始化时,它才能工作。唯一保证这一点的方法是,如果值是在类定义内设置的,而不是像你所拥有的那样设置在它之外。(但是现在这在 C++11 中是可能的 - 请参阅 tacp 评论中的链接。)
如果我们确实想让您的语法正常工作,那么我们需要将声明的值作为隐藏的静态值存储在某处,以便任何构造函数都能将其拾取并知道将其用作x
. 然而,这个静态变量可能存在也可能不存在,我们唯一可以知道的一点是,对于不同编译单元中的构造函数,是在链接时。因此,我们要么生成额外的冗余代码来从这个隐藏的静态(或冗余数据)中初始化 x,要么我们要求生成链接时间代码来解决这个问题,这给编译器开发人员带来了很大的负担。有可能,是的,但如果不允许这样做,一切都会更简单。