C++初始化列表 - 我不明白

hel*_*hod 12 c++ initialization-list

在Effective C++中,据说初始化列表中的数据元素需要按其声明的顺序列出.进一步说,对此的推理是数据元素的析构函数以其构造函数的相反顺序被调用.

但我只是看不出这可能是个问题......

sha*_*oth 25

好好考虑以下几点:

class Class {
    Class( int var ) : var1( var ), var2(var1 ) {} // allright
    //Class( int var ) : var2( var ), var1(var2 ) {} // var1 will be left uninitialized

    int var1;
    int var2;
};
Run Code Online (Sandbox Code Playgroud)

第二个(注释掉的)构造函数看起来很好,但实际上只会var2初始化 - var1将首先进行初始化,var2然后使用尚未初始化的那个进行初始化.

如果按照与成员变量相同的顺序列出初始化程序,则在类声明中列出此类错误的风险会降低很多.

  • +1不知道如果初始化的顺序是不同的,那么这样的事情就会发生......我每天都在学习新东西! (5认同)

Cyg*_*sX1 10

当成员也是某种类的对象时,构造和破坏的顺序可能是重要的,这些对象以某种方式相互依赖.

考虑一个简单的例子:

class MyString {
public:
  size_t s_length;
  std::string s;
  MyString(const char *str) : s(str), s_length(s.length()) {}
};
Run Code Online (Sandbox Code Playgroud)

此示例中的意图是成员s_length保存存储字符串的长度.但这不起作用,因为之前s_length会进行初始化.所以你在执行构造函数之前调用! ss.lengths


fli*_*ght 7

例如,如果您有这样的类:

class X {
  int a,b;
  X(int i) : b(i),a(b) { } // Constructor
};
Run Code Online (Sandbox Code Playgroud)

类X的构造函数看起来首先初始化"b",但它实际上是按声明的顺序初始化.这意味着它将首先初始化"a".然而,"a"初始化为尚未初始化的"b"值,因此"a"将获得垃圾值.