我试图定义一个这样的公共静态变量:
public :
static int j=0; //or any other value too
Run Code Online (Sandbox Code Playgroud)
我在这一行得到了一个编译错误:ISO C++禁止非const静态成员`j'的类内初始化.
为什么在C++中不允许这样做?
为什么允许const成员初始化?
这是否意味着C++中的静态变量没有像C一样用0初始化?
谢谢 !
Den*_*ler 20
您必须在.cpp文件中初始化静态变量,而不是在类声明中.
在类中声明静态变量时,可以在不实例化类的情况下使用它.
//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
}
Run Code Online (Sandbox Code Playgroud)
dir*_*tly 18
为什么在C++中不允许这样做?
除非您定义它,否则变量不会成为l值.
为什么允许const成员初始化?
即使在这种情况下,如果要获取变量的地址,也需要定义.
9.4.2静态数据成员
2在类定义中声明静态数据成员不是定义,除了cv-qualified void之外,它可能是不完整的类型.静态数据成员的定义应出现在包含成员类定义的命名空间范围内.在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定.静态数据成员定义中的初始化表达式在其类的范围内
此外,这主要是一个使用工件,所以你可以写:
class S {
static const int size = 42;
float array[ size ];
};
Run Code Online (Sandbox Code Playgroud)
这是否意味着C++中的静态变量没有像C一样用0初始化?
不,是他们:
3.6.2非局部变量的初始化
在进行任何其他初始化之前,具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应为零初始化(8.5).
虽然事情在C++ 0x中变得更加棘手.现在可以初始化所有文字类型(而不是当前标准中的整数类型),这意味着现在可以使用声明中的初始化程序初始化所有标量类型(包括浮点数)和某些类类型.
Eug*_*nca 18
(1.)为什么C++中不允许这样做?
来自Bjarne Stroustrup的C++风格和技巧常见问题解答:__CODE__
(2.)为什么允许const成员初始化?
[ dirkgently说它更好 ]
(3.)这是否意味着C++中的静态变量没有像C一样用0初始化?
据我所知,只要你在.cpp中声明静态成员var,如果你没有另外指定,它将被零初始化:
// in some .cpp
int Test::j; // j = int();
Run Code Online (Sandbox Code Playgroud)
简短的回答:
这相当于说extern int Test_j = 0;
.
如果确实编译了,会发生什么?包含类的头文件的每个源文件都会定义一个名为Test :: j的符号,该符号初始化为0.链接器往往不喜欢这样.
归档时间: |
|
查看次数: |
33077 次 |
最近记录: |