我已经读过构造函数只能初始化非静态属性。我写了一个小代码来检查,我现在想知道因为编译器dosnt显示任何错误???那么我可以在构造函数中初始化静态属性和非静态属性吗?这是我的代码!非常感谢你!
class NixIs {
int var;
static int global;
public:
NixIs(int val = 0)
{
global = val;
}
答案 0 :(得分:3)
我认为你的意思是“字段”而不是“attribute”
您的代码是有效的C ++,但它没有初始化静态字段global
,因为它是一个实例构造函数。
如果要使用一个简单的常量值(在编译时已知)初始化NixIs::global
,您可以在标题中内联指定它:
<强> NixIs.h 强>:
class NixIs {
static int global = 0;
}
如果您具有非常量初始值(例如无参数自由函数结果),则静态字段初始值设定项需要位于代码文件(而不是标题)中。除了类型和静态字段的初始值之外,还需要指定静态字段:
<强> NixIs.h 强>:
class NixIs {
static int global;
}
<强> NixIs.cpp 强>:
int NixIs::global = nonTrivialValue;
如果要以特定顺序或函数结果值初始化多个静态字段,则需要使用hack,因为C ++没有静态构造函数。见这里:Static constructor in c++
答案 1 :(得分:0)
通常使用初始化列表来初始化构造函数中的属性。例如,您可以像这样初始化类中的非静态属性:
NixIs( int init_val) : val(init_val) {
// do stuff
}
我认为这就是你的意思。尝试初始化这样的静态类成员将是一个错误。但是,包括构造函数和析构函数在内的所有类方法都可以访问静态成员。在您的示例中,&#39; global&#39;只会被创建的每个新实例覆盖。
NixIs first(1); // first.global is now 1
NixIs second(2); // first.global is now also 2 (same as second.global)