在C ++中定义静态成员

我想要这样定义一个公共的静态variables:

public : static int j=0; //or any other value too 

我得到了这样一个编译错误:ISO C ++禁止非常量静态成员“j”的类初始化。

  1. 为什么在C ++中不允许?

  2. 为什么const成员被允许初始化?

  3. 这是否意味着C ++中的静态variables不会像在C中那样使用0进行初始化?

谢谢 !

(1.)为什么在C ++中不允许?

来自Bjarne Stroustrup的C ++风格和技巧常见问题解答 : A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects. A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects.

(2.)为什么const成员被允许初始化?

[ dirkgently说得好 ]

(3.)这是否意味着C ++中的静态variables不会像C中那样使用0进行初始化?

据我所知,只要你在.cpp中声明静态成员var,如果你没有另外指定,它将被初始化为零:

 // in some .cpp int Test::j; // j = int(); 

为什么在C ++中不允许?

除非你定义它,否则该variables不会成为l值。

为什么const成员被允许初始化?

即使在这种情况下,如果要获取variables的地址,也需要定义。

9.4.2静态数据成员

2类定义中静态数据成员的声明不是一个定义,可能是一个不完整的types,而不是cv-qualified void。 静态数据成员的定义应出现在包含成员的类定义的命名空间范围内。 在名称空间范围的定义中,静态数据成员的名称应该使用::运算符通过类名来限定。 静态数据成员定义中的初始化expression式处于其类的范围内

另外,这主要是一个使用工件,所以你可以写:

 class S { static const int size = 42; float array[ size ]; }; 

这是否意味着C ++中的静态variables不会像C中一样使用0进行初始化?

不,是他们:

3.6.2初始化非局部variables

静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的variables在进行任何其他初始化之前应该初始化为(8.5)。

尽pipe在C ++ 0x中事情变得更复杂一些。 现在所有的字面types都可以被初始化(相对于当前标准中的整型),这意味着所有的标量types(包括浮点数)和一些类types现在可以在声明中使用初始化器来初始化。

您将不得不在.cpp文件中初始化静态variables,而不是在类声明中。

在类中声明一个静态variables时,可以使用它,而不需要实例化一个类。

 //Header file class Test { public: static int j; }; //In cpp file //Initialize static variables here. int Test::j = 0; //Constructor Test::Test(void) { //Class initialize code } 

简短的回答:

这相当于说extern int Test_j = 0;

如果它编译,会发生什么? 包括你的类的头文件的每个源文件都会定义一个叫做Test :: j的符号,初始化为0.链接器往往不会那样。

 class GetData { private: static int integer; //Static variable must be defined with the extension of keyword static; public: static void enter(int x) { integer = x; //static variable passed through the static function } static int show() //declared and defined { return integer; //will return the integer's value } }; int GetData::integer = 0; //Definition of the static variable int main() { GetData::enter(234); //value has been passed through the static function enter. Note that class containing static variables may not have the object in main. They can be called by scope resolution operator in main. cout<<GetData::show(); }