如何在c ++中初始化静态属性?

时间:2016-01-12 23:44:36

标签: c++

我已经读过构造函数只能初始化非静态属性。我写了一个小代码来检查,我现在想知道因为编译器dosnt显示任何错误???那么我可以在构造函数中初始化静态属性和非静态属性吗?这是我的代码!非常感谢你!

class NixIs {
    int var;
    static int global;
public:
    NixIs(int val = 0) 
    {
        global = val;
    }

2 个答案:

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