空和默认的构造函数和成员初始化

时间:2015-12-31 12:11:13

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

请考虑以下代码:

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填充零)以及哪些情况导致未初始化成员?

1 个答案:

答案 0 :(得分:4)

首先,c是函数声明(vexing parse)

对于2,3,内置的值初始化将进行零初始化 2,3将调用std::string的默认构造函数,std::vector(如此为空)
2将初始化值std::array(其元素值已初始化)
3将聚合初始化std::array这是一个聚合(其元素的值初始化,0intdouble)。

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

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

  • default-initialization调用默认构造函数。
  • value-initialization call默认构造函数。

对于myClass,对于0:

  • default-initialization执行其成员的默认初始化。
  • 值初始化执行零初始化,然后默认初始化。

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