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

How to initialize static attribute in c++?

本文关键字:初始化 静态 属性 c++      更新时间:2023-10-16

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

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

我想你指的是"字段"而不是"属性"

您的代码是有效的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;

如果你想以特定的顺序或用函数结果值初始化多个静态字段,你需要使用破解,因为C++没有静态构造函数。请参阅此处:c++中的静态构造函数

初始化构造函数中的属性通常使用初始化器列表来完成。例如,您可以初始化类中的非静态属性,如下所示:

NixIs( int init_val) : val(init_val) {
  // do stuff
}

我想这就是你的意思。尝试初始化这样的静态类成员将是一个错误。但是,包括构造函数和析构函数在内的所有类方法都可以访问静态成员。在您的示例中,"global"只会被创建的每个新实例覆盖。

NixIs first(1); // first.global is now 1
NixIs second(2); // first.global is now also 2 (same as second.global)