我试图使用以下代码:
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
上述实现有什么问题?
错误消息非常准确地告诉您问题。
问题是静态成员只有一个实例,而不管您碰巧创建了多少类实例。即使您创建了该类的多个实例,您也只需对其进行一次初始化——这意味着它不能附加到构造函数。
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);
}
静态变量不是对象的一部分——它们是类的一部分。这就是为什么您不能将它们与对象的其他成员一起初始化的原因。
您需要在源文件的某处提供静态变量的定义,并且可以将其初始化放在那里:
int Test::x = 5;
类静态变量必须在类主体之外进行存储,并且可以进行初始化。像这样:
class Test
{
private:
static int x;
public:
Test(int i) { x = i; }
};
int Test::x = 42;
main()
{
Test a(5);
}