2015-12-31 101 views
1

考慮下面的代碼:空默認構造函數和成員初始化

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用零填充),導致未初始化的成員什麼情況下,什麼情況下?

+3

最棘手的解析被初始化'MyClass的<性病::陣列> C();' – 101010

回答

4

首先,c是函數(傷腦筋的分析)的聲明

對於2,內置的3,值初始化會做一個零初始化
2,3會調用std::string默認構造函數,std::vector(所以空)
2將價值初始化std::array(其元素的值初始化)
3將聚合 - 初始化std::array這是一個聚合(其元素的值初始化,因此0int,double)。

爲0,1,內置的默認初始化不會初始化它們
0,1會調用std::string默認構造函數,std::vector(所以空)
std::array默認初始化將默認初始化它的元素(intdouble未初始化)

對於myClass,1,2,3:

  • 缺省初始化調用默認構造函數。
  • 值初始化調用默認構造函數。

對於myClass,爲0:

  • 缺省初始化執行其成員的缺省初始化。
  • 值初始化執行零初始化,然後默認初始化。

    所以成員爲2,3,B-0,d-0,E-0

相關問題