Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态数据成员的初始化_C++_Storage Duration - Fatal编程技术网

C++ 静态数据成员的初始化

C++ 静态数据成员的初始化,c++,storage-duration,C++,Storage Duration,为什么静态数据成员的默认初始化没有发生?在下面的示例中 struct data_member { data_member(){ cout << "data_member\n"; } ~data_member(){ cout << "~data_member\n"; } }; struct Y { static data_member m; Y(){ cout << "Y\n"; } ~Y(){ cout <<

为什么静态数据成员的默认初始化没有发生?在下面的示例中

struct data_member
{
    data_member(){ cout << "data_member\n"; }
    ~data_member(){ cout << "~data_member\n"; }
};

struct Y
{
    static data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

Y y; //call constructor of Y 
静态数据成员在类定义中声明。它们需要在此之外定义一次,通常在相应的cpp文件中:

在这里,您将看到它的默认名为ctor

struct Y
{
    static data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

这定义了m和

静态成员必须在类定义之外定义。它将被初始化,也可以在那个时候被默认初始化

以下来自标准草案的关于静态成员变量的描述应该解释为什么它不是在类声明中默认初始化的

9.4.2静态数据成员

2静态数据成员在其类定义中的声明不是定义,可能是除cv限定void之外的不完整类型。静态数据成员的定义应出现在包含该成员的类定义的命名空间范围中。在命名空间范围的定义中,静态数据成员的名称应使用::运算符通过其类名限定

基本答案: 对于类成员,它就像函数一样。 我们有声明和定义。 您在类级别声明它们的存在,并由构造函数进行定义。 使用静态成员会使其更加复杂。它们与实例无关,构造函数不会定义它们。你必须在课外自己做:

Type CLASS::member;
顺便说一句,使用静态成员是一种基本的做法

请改用静态函数:

class Foo{
public:
     Type &getMember(){
         static Type member;
         return member;
     }
};

因为您没有为m@CaptainObvlious 9.4.2/6提供定义:静态数据成员的初始化和销毁与非局部变量完全相同。这意味着必须执行默认初始化。这是完全正确的,只要您提供了一个尚未执行的定义。@CaptainObvlious非静态数据成员为什么要初始化?@DmitryFucintv非静态成员显然需要在构造对象时构造。静态成员声明不会导致构造,因为它只声明成员的存在。
data_member Y::m;
Type CLASS::member;
class Foo{
public:
     Type &getMember(){
         static Type member;
         return member;
     }
};