2017-06-15 29 views
0

我已經定義了下面的結構和它的默認構造函數:初始化與用戶定義的構造

struct State 
{ 
    State() 
    { 
    // Initialize both stacks with unit matrices 
    objStack.push(Matrix(1, 1, 1, SCALE)); 
    lightStack.push(Matrix(1, 1, 1, SCALE)); 
    } 

    std::stack<Affine> objStack; 
    std::stack<Affine> lightStack; 

    int maxDepth = 5; 
    std::unique_ptr<Point[]> vertices = nullptr; 
    Colour ambient = Colour(0.2); 
}; 

如果當我實例化一個國家結構是執行我聲明的構造函數,將最後3個變量仍然用5,nullptr和Color(0.2)初始化?或者我的構造函數應該如下所示:

State() 
    { 
    // Initialize both stacks with unit matrices 
    objStack.push(Matrix(1, 1, 1, SCALE)); 
    lightStack.push(Matrix(1, 1, 1, SCALE)); 

    maxDepth = 5; 
    vertices = nullptr; 
    ambient = Colour(0.2); 
    } 

我不確定這裏會發生什麼。

+0

你的第一個版本是否編譯? –

+0

它編譯! – user3266738

+0

默認情況下,不需要顯式初始化具有值的變量。在你的第二個代碼片段中,成員將被初始化兩次。 –

回答

3

在C++ 11或更高版本中,第一個示例是正確的。它將初始化類成員作爲構造過程的一部分,這將在調用構造函數struct State之前發生。在C++ 11之前,以這種方式對成員進行類內初始化是無效的,並且不會被編譯。您將使用一個初始化程序列表以不同的方式編寫以下部分,這會生成與C++ 11代碼相同的行爲。

struct State 
{ 
    State() : maxDepth(5), verticies(NULL), ambient(0.2) 
    { ... 
    } 

    int maxDepth; 
    std::unique_ptr<Point[]> vertices; 
    Colour ambient; 
}; 

如果您編寫代碼來在構造函數的主體中設置類成員,它們將被設置兩次。一旦在結構的構造函數通過成員的默認構造函數執行之前,再次在struct的ctor的主體中設置它們的值時。 int或其他基本類型沒有默認構造函數,所以在struct ctor主體中的代碼設置它之前,它將被初始化。但是像std::unique_ptr這樣的對象會被設置兩次,因爲它有一個默認的CTOR,可以在struct ctor主體運行之前使用。