#include<iostream>
using namespace std;
class sample {
public:
static int x;
};
//int sample::x = 20;
int main() {
sample s1;
int sample::x = 30;
}
当我编译此程序时出现错误无效使用限定名称'sample :: x'
我知道我收到此错误是因为在main中声明了 int sample :: x = 30; 。
但是我不明白为什么我不能在main中定义 int sample :: x = 30; ?
答案 0 :(得分:6)
正如标准所说:
静态数据成员的定义应出现在包含成员类定义的命名空间范围内。
此外,静态数据成员的定义属于类的范围。 所以,
int x = 100; //global variable
class StaticMemeberScope
{
static int x;
static int y;
};
int StaticMemeberScope::x =1;
int StaticMemeberScope::y = x + 1; // y =2 (StaticMemeberScope::x, not ::x)
答案 1 :(得分:3)
您必须在全局命名空间中为其分配空间
#include<iostream>
class sample {
public:
static int x;
};
int sample::x = 20;
int main() {
sample s1;
sample::x = 30;
}
您可以在main或任何其他方法中正常设置它。这是static关键字的tutorial。我删除了using指令,因为引入整个命名空间是不好的做法,特别是当你不需要它时。
需要初始化静态变量的原因是全局范围,因为静态变量和全局变量都具有静态存储持续时间
答案 2 :(得分:1)
静态成员就像全局对象只能通过sample::x
您必须在定义类的全局范围内初始化它们。
所以你无法在main
初始化,这是一个语法错误。
答案 3 :(得分:1)
您无法在函数中定义静态变量,但必须在任何范围之外执行此操作: 尝试
int sample::x = 30;
int main() {
sample s1;
}
代替。 你可以这样做:
int sample::x = 30;
int main() {
sample s1;
sample::x = 42; // Note the different syntax!
}