我试图使用以下代码:
class Test
{
private:
static int x;
public:
Test(int i) : x(i) {}
};
main()
{
Test a(5);
}
但是,我得到了错误:
‘int Test::x’ is a static data member; it can only be initialized at its definition
上述实施有什么问题?
答案 0 :(得分:4)
错误消息非常准确地告诉您问题。
问题是静态成员只有一个实例,无论您碰巧创建了多少个类实例。您只需初始化一次,即使您创建了该类的多个实例 - 这意味着它无法附加到构造函数。
class Test
{
private:
static int x;
public:
};
int Test::x = 1; // newly added
main()
{
Test a;
}
在这种情况下,看起来你可能根本不想要一个静态成员变量 - 你在创建一个类的实例时传递一个值来初始化它,这往往表明你可能只是想要一个普通的成员变量:
class Test
{
private:
int x;
public:
Test(int i) : x(i) {}
};
main()
{
Test a(5);
}
在这种情况下,如果你想要一个具有不同值的对象的第二个实例,你可以这样做:
main() {
Test a(5), b(1);
}
答案 1 :(得分:3)
静态变量不是对象的一部分 - 它们属于该类的一部分。这就是为什么你不能将它们与对象的其他成员一起初始化的原因。
在源文件中的某个位置,您需要提供静态变量的定义,并且可以将其初始化放在那里:
int Test::x = 5;
答案 2 :(得分:1)
类静态变量必须具有存储空间,并且可能在类主体外部进行初始化。像这样:
class Test
{
private:
static int x;
public:
Test(int i) { x = i; }
};
int Test::x = 42;
main()
{
Test a(5);
}