2
#include<iostream>
using namespace std;

class sample {
    public:
        static int x;
};

//int sample::x = 20;

int main() {
    sample s1;
    int sample::x = 30;
}

当我编译这个程序然后得到一个错误Invalid use of qualified-name 'sample::x'

我知道我收到这个错误是因为这个声明int sample::x = 30; 主要。

但我不明白为什么我不能定义 int sample::x = 30; 主要?

4

4 回答 4

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)
于 2013-08-01T17:50:51.610 回答
3

您必须在全局命名空间中为其分配空间

#include<iostream>

class sample {
    public:
        static int x;
};

int sample::x = 20;

int main() {
    sample s1;
    sample::x = 30;
}

您可以在 main 或任何其他方法中正常设置它。这是关于静态关键字的教程。我删除了 using 指令,因为引入整个命名空间是不好的做法,尤其是当您不需要它时。

静态变量需要初始化的原因是全局范围是因为静态变量和全局变量都有静态存储持续时间

于 2013-08-01T17:30:41.730 回答
1

静态成员就像全局对象只能通过sample::x

您必须在定义类的全局范围内初始化它们。

所以你不能初始化 in main,这是一个语法错误。

于 2013-08-01T17:34:35.240 回答
1

您不能在函数内定义静态变量,但必须在任何范围之外执行此操作:尝试

int sample::x = 30;

int main() {
    sample s1;
}

反而。你可以这样做:

int sample::x = 30;

int main() {
    sample s1;

    sample::x = 42; // Note the different syntax!
}
于 2013-08-01T17:36:04.613 回答