2013-03-20 81 views
3

我尝试使用下面的代码:为什么我不能在初始化程序列表中初始化静态变量?

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

因为它没有有意义吗? – 2013-03-20 04:20:02

+0

请注意,您可以在类级别初始化静态const积分。 – Synxis 2013-03-20 09:00:03

回答

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