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

时间:2013-03-20 04:12:03

标签: c++ oop static

我试图使用以下代码:

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

上述实施有什么问题?

3 个答案:

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