代码之家  ›  专栏  ›  技术社区  ›  Vincent

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

  •  1
  • Vincent  · 技术社区  · 8 年前

    考虑以下代码:

    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 设置为 nullptr , arr 用零填充),哪些情况会导致成员未初始化?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Community Egal    4 年前

    第一 c 是函数的声明(烦人的解析)

    对于2,3,内置的值初始化将执行零初始化
    2,3将调用的默认构造函数 std::string , std::vector (如此空)
    2将值初始化 std::array (其元素已值初始化)
    3将聚合初始化 std::数组 它是一个聚合(其元素的值初始化,因此 0 对于 int , double ).

    对于0,1,内置的默认初始化不会初始化它们
    0,1将调用的默认构造函数 标准::字符串 , std::矢量 (如此空)
    的默认初始化 std::数组 将默认初始化其元素( 整数 双重的 未初始化)

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

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

    对于 我的类 ,对于0:

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

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

      因此,将为2、3、b-0、d-0、e-0初始化成员