在C++對象中,當您從另一個構造函數或成員函數調用構造函數時(在構造該對象之後),您調用的構造函數的初始化程序列表是否仍然執行?從另一個成員函數/構造函數調用C++構造函數是否執行初始化程序列表?
回答
不要從另一個方法或另一個構造函數顯式調用構造函數。
如果您真的需要使用兩階段初始化,在構造對象之後調用Init()
類型的方法。
只能通過新建或堆棧中的對象構造來顯式調用構造方法。有辦法破解它(例如放置新的),但不這樣做,只需使用兩階段構建&初始化。
我假設你指的是從派生類的初始化列表中調用基類構造函數。假設情況如此,那麼首先執行BASE類構造函數(包括其初始化程序列表),然後調用派生類的初始化程序列表。
如果您想知道 - 基類構造函數在派生類執行初始化程序列表之前調用ALWAYS,即使對基類構造函數的調用顯式出現在派生類的中間或末尾初始化列表(以及它是否出現在開頭)。原因是初始化程序列表中的項目按照它們出現在類頭文件的DECLARATION類中的順序執行,而不是按它們在構造函數定義中的初始化程序列表中出現的順序執行。而基類類構造函數從未在派生的類聲明中聲明。 C++要求在派生類構造函數之前調用基類構造函數 - 無論對基類構造函數的調用是否顯式出現在派生類的初始化列表中,也不要在初始化程序列表中出現的位置。
在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
派生- 1. 在構造函數初始化程序中使用成員的成員函數
- 2. 從另一個構造函數調用默認構造函數
- 3. 長構造函數初始化列表
- 4. 初始化列表到構造函數
- 5. 通過構造函數初始化成員函數
- 6. 有多個構造函數初始化成員變量調用
- 7. 初始化列表:從基類的構造函數和成員函數
- 8. 調用構造函數並初始化
- 9. 構造函數初始化列表中的執行順序
- 10. 在構造函數中調用類成員的構造函數
- 11. 在構造函數中調用另一個構造函數
- 12. 在構造函數範圍初始化而不是成員初始化列表
- 13. C++的構造函數初始化多個成員
- 14. 從參數化構造函數調用默認構造函數
- 15. C + + 11:std ::線程內執行一個函數成員與線程初始化在構造函數
- 16. 初始化構造函數C++
- 17. C++模板構造函數初始化
- 18. c#構造函數與初始化
- 19. 當一個構造函數被顯式調用時,是否構造了構造函數和成員變量?
- 20. 初始化程序列表是否抑制對構造函數的調用?
- 21. 成員構造函數和析構函數調用的順序
- 22. 初始化列表和構造函數調用順序
- 23. 構造函數被「調用」與構造函數被「執行」?
- 24. 使用構造函數的參數初始化矢量成員
- 25. 使用構造函數參數初始化類成員
- 26. Cpp。哪個被首先調用/初始化?類構造函數或其成員類的構造函數?
- 27. constexpr構造函數初始化列表中的Constexpr函數
- 28. 使用函數構造函數初始化調用
- 29. 在構造函數C++中初始化成員向量
- 30. 構造函數中私人成員初始化的差異(C++)