复制构造函数初始化

Sta*_*owl 1 c++ copy-constructor c++11

Vector::Vector(const Vector& a) : elem{new double[sz]}, sz{a.sz}
{
  for(int i = 0; i!= sz; ++i)
      elem[i] = a.elem[i];
}
Run Code Online (Sandbox Code Playgroud)

这里有趣的部分是elem {new double [sz]}之前

sz{a.sz}
Run Code Online (Sandbox Code Playgroud)

所以就是这样

sz
Run Code Online (Sandbox Code Playgroud)

已初始化.

但它不会抛出任何错误,对吧?

有人可以告诉我一些关于标准中相应部分的内容,对内部工作的更深入的了解,或者其他方式如何受到监管?

4pi*_*ie0 10

初始化列表的重要之处在于成员不是按照它们在初始化列表中的出现顺序初始化的,而是按类中的声明顺序初始化的.

C++标准n3337 § 12.6.2/10初始化碱和构件

在非委托构造函数中,初始化按以下顺序进行:

- 首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基类的有向无环图的深度优先从左到右遍历的顺序进行初始化,其中"左" -to-right"是派生类base-specifier-list中基类出现的顺序.

- 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何).

- 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序如何).

- 最后,执行构造函数体的复合语句.

[注意:声明顺序的作用是确保以初始化的相反顺序销毁基础和成员子对象. - 结束说明]

(现在我将重复我的另一个答案,但我认为这不会伤害任何人)这很重要.记住这一点,以避免错误

/* trying to allocate (possibly) very large block of memory
   as a result of initializing a vector with
   uninitialized integer: std::vector<int> v( N)
*/
class SearchEngine {
    std::vector<int> v;
    int N;
    explicit SearchEngine( std::vector<int> const& keys)
                  : N( keys.size()), v( N), {
Run Code Online (Sandbox Code Playgroud)