2012-05-04 16 views

回答

0

不要從另一個方法或另一個構造函數顯式調用構造函數。

如果您真的需要使用兩階段初始化,在構造對象之後調用Init()類型的方法。

0

只能通過新建或堆棧中的對象構造來顯式調用構造方法。有辦法破解它(例如放置新的),但不這樣做,只需使用兩階段構建&初始化。

1

我假設你指的是從派生類的初始化列表中調用基類構造函數。假設情況如此,那麼首先執行BASE類構造函數(包括其初始化程序列表),然後調用派生類的初始化程序列表。

如果您想知道 - 基類構造函數在派生類執行初始化程序列表之前調用ALWAYS,即使對基類構造函數的調用顯式出現在派生類的中間或末尾初始化列表(以及它是否出現在開頭)。原因是初始化程序列表中的項目按照它們出現在類頭文件的DECLARATION類中的順序執行,而不是按它們在構造函數定義中的初始化程序列表中出現的順序執行。而基類類構造函數從未在派生的類聲明中聲明。 C++要求在派生類構造函數之前調用基類構造函數 - 無論對基類構造函數的調用是否顯式出現在派生類的初始化列表中,也不要在初始化程序列表中出現的位置。

2

在C++ 11中,您可以將構造函數委託工作到同一個類中的另一個構造函數,例如, :

#include <iostream> 
struct SomeType { 
    int number; 

    SomeType(int new_number) : number(new_number) {} 
    SomeType() : SomeType(42) {} 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

在這種情況下,禁止該代表團之後有一個initaliser列表,例如將前面的示例更改爲:

SomeType() : SomeType(42), number(0) {} 

是錯誤。


如果問題是「給定了繼承關係,那麼匿名者列表仍然會被調用?」答案是肯定的,例如

#include <iostream> 
struct SomeBase { 
    SomeBase(int) {} 
}; 

struct SomeType : SomeBase { 
    int number; 

    SomeType(int new_number=0) : SomeBase(new_number), number(new_number) {} 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

這很好,它的工作原理就是你希望的。


這是不合法的直接調用構造函數從另一個構造函數中,並在C++之前,C++ 11沒有構造代表團允許要麼,所以像:

#include <iostream> 

struct SomeType { 
    int number; 

    SomeType(int new_number) : number(new_number) {} 
    SomeType() { 
     SomeType::SomeType(0); // Error! 
    } 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

是一個錯誤,不能直接表達。

下(我猜是寫的問題時,你腦子裏想的是什麼)的例子不是然而錯誤,但不這樣做,你可能會希望什麼:

#include <iostream> 

struct SomeType { 
    int number; 

    SomeType(int new_number) : number(new_number) {} 
    SomeType() { 
     SomeType(0); 
     number = 42; 
    } 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

這裏不帶參數的構造函數構造SomeType的匿名臨時實例。它是最初調用構造函數的一個完全獨立的實例。這是完全合法的,但可能不是你想要做的。如果你這樣做,如果你不小心,你可能會創建無限遞歸的風險,如果你最終做了這樣的事情,我認爲這可能是一個設計問題的好指標!

從維基百科C++11 article

派生
相關問題