繁体   English   中英

初始化类的静态非常量数据成员

[英]Initialize a static non-const data member of a class

我已经编写了以下示例代码:

class MyClass {
    static int a;
  public:
    MyClass ( int i ) : a ( i )    {
      cout << " \n ctor called. a is : "<< a << " \n";
    }
};

int   MyClass::a = 1;   

int main( ) {
    MyClass my(2);
}

我知道这会产生编译错误,因为静态数据成员不能在构造函数初始化器列表中使用。

那么,如何在每次创建类的对象时初始化静态数据成员? 我希望从构造函数调用的静态成员函数可以做到这一点。 那是唯一可能的方法吗?

很简单,在构造函数的主体中为a 分配一个值:

MyClass ( int i )  {
  a = i;
  cout << " \n ctor called. a is : "<< a << " \n";
}

您不能使用初始化列表来执行此操作,因为a尚未初始化 ,只是被分配了一个新值。 在调用构造函数之前,在程序开始时, a将被初始化为值0(未初始化的static变量设置为0)。

这是编译器告诉您的,这很简单:

错误:“ int MyClass :: a”是静态数据成员; 它只能在定义时初始化

虽然看起来有点愚蠢,但是您确定它应该是static而不是实例变量吗? 整个程序中仅存在一个static变量实例,并且该实例的生命周期从程序开始执行到终止。

编辑:看来您确实意识到,通过您的评论之一的外观,只会有一个static变量的实例。 请注意, 初始化赋值是两件事。

关键字static指出,对于每个类实例,成员变量将没有自己的值,而是使用您编写的代码行初始化的一个值:

int   MyClass::a = 1;

构造函数的目标是初始化实例 ,但是静态变量成员与实例无关,因此您无法在用于初始化非静态成员的初始化列表中对其进行初始化。 如果您为变量分配的值不在构造函数的初始化列表中,则只需替换变量的值即可,因为它是静态的。

您应该在这里阅读更多有关它的信息: http : //www.bogotobogo.com/cplusplus/statics.php

对于类的所有实例,静态成员变量应该保持不变。 如果要在构造函数中进行更改,请使用普通成员变量。

但是要回答您的问题:是的,您可以调用静态成员函数来设置变量。 或者只是在函数的主体中而不是在初始化列表中进行设置。

How to initialize the static data member each time an object of the class is created?

你不可以做这个。 静态数据成员不是类的对象/实例的一部分,而是单独的对象,仅在程序启动时才创建和初始化一次。 创建新的类实例时,您可以做的就是为其分配新的值 (但是问题是为什么要这样做-使用应该是实例特定的非静态成员;静态成员在类的所有实例之间共享)。

非const static int成员必须在文件范围内定义,这就是您可以在示例中进行显式初始化的地方。 如果省略了initializer( 1 ),则变量的静态持续时间将由编译器使用0进行初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM