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