为什么我不能在初始化列表中初始化静态变量?

3

I was trying to use the following code:

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

上述实现有哪些问题?

因为这没有任何意义? - Ed S.
请注意,您可以在类级别上初始化静态常量整数。 - Synxis
3个回答

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);
}

3
静态变量不是对象的一部分 - 它们是类的一部分。这就是为什么您不能与对象的其他成员一起初始化它们的原因。
在源文件的某个地方,您需要提供静态变量的定义,并且可以在那里进行初始化:
int Test::x = 5;

1

类的静态变量必须在类外部有存储,并且可以进行初始化。例如:

class Test 
{
private:
    static int x;
public:
    Test(int i) { x = i; }
};
int Test::x = 42;

main()
{
    Test a(5);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接