【问题标题】:Empty and defaulted constructor and member initialization空的和默认的构造函数和成员初始化
【发布时间】:2016-04-05 10:07:54
【问题描述】:

考虑以下代码:

template <class T>
struct myclass 
{
    // Select only one constructor in the following
    myclass() = default;                                 // 0
    myclass() {};                                        // 1
    myclass(): i{}, ptr{}, var{}, arr{}, vec{}, str{} {} // 2
    myclass(): i(), ptr(), var(), arr(), vec(), str() {} // 3

    // Data members
    int i;
    T* ptr;
    T var;
    std::array<int, 3> arr;
    std::vector<T> vec;
    std::string str;
};

及其用途:

myclass<std::array<double, 3>> a;
myclass<std::array<double, 3>> b{};
myclass<std::array<double, 3>> c();
auto d = myclass<std::array<double, 3>>{};
auto e = myclass<std::array<double, 3>>();

因此,总共选择了混合构造函数/构造方法,我们有 4 * 5 = 20 个案例:a0, a1, a2, a3, b0, b1, b2, b3, ..., e3。我的问题是:

哪些情况会导致成员初始化(i 设置为零,ptr 设置为nullptrarr 填充为零)以及哪些情况导致成员未初始化?

【问题讨论】:

  • 最麻烦的解析myclass&lt;std::array&lt;double, 3&gt;&gt; c();

标签: c++ constructor initialization c++14 default-constructor


【解决方案1】:

首先,c 是一个函数声明(恼人的解析)

对于 2、3,内置的值初始化将进行零初始化
2、3会调用std::stringstd::vector的默认构造函数(所以空)
2 将值初始化std::array(其元素已初始化)
3 将聚合初始化 std::array 这是一个聚合(其元素的值初始化,所以 0int,double)。

对于0、1,内置的默认初始化不会初始化它们
0, 1 将调用std::stringstd::vector的默认构造函数(所以为空)
std::array 的默认初始化将默认初始化其元素(intdouble 未初始化)

对于myClass,对于 1、2、3:

  • 默认初始化调用默认构造函数。
  • 值初始化调用默认构造函数。

对于myClass,对于0:

  • default-initialization 执行其成员的默认初始化。

  • 值初始化执行零初始化,然后执行默认初始化。

    所以成员会被初始化为 2, 3, b-0, d-0, e-0

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2015-07-03
    • 2015-10-07
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多