我可以使用相同的C++這樣的[...]如果構造函數是強制性的。從this tutorial我得到,我們可以創建這樣的對象[...]這不需要一個構造函數。
這是錯誤的。構造函數必須存在才能創建對象。構造函數可能由在某些情況下由編譯器隱式定義(如果不提供任何),但如果您希望實例化對象,則最終構造函數必須存在。實際上,一個對象的生命週期定義爲在構造函數例程返回時開始。
從段落的C++ 11標準的3.8/1:
[...] T類型的對象的生存期開始時:
- 存儲與所述適當的對準和大小爲T型,並且
- 如果對象具有非平凡的初始化,則其初始化完成。
因此,構造函數必須存在。
1)兩種創建類對象的方式有什麼區別。
當你實例化與自動存儲持續時間對象,像這樣的(其中X
是一些類):
X x;
您正在創建將當它超出範圍自動銷燬的對象。另一方面,當你這樣做時:
X* x = new X();
你正在動態地創建一個對象,並且你將它的地址綁定到一個指針。這樣,您所創建的對象將不被當你x
指針超出範圍破壞。
在現代C++中,這被看作是一個可疑的編程習慣:雖然指針是重要的,因爲它們允許實現reference semantics,生指針是不好的,因爲它們可能會導致內存泄漏(對象活得比他們所有的指針和從來沒有被破壞掉了),或在懸擺指針(指針活得比他們指出,提領時可能導致未定義行爲)的對象。
事實上,new
創建對象時,你總是有要記得delete
摧毀它:
delete x;
如果您需要參考的語義,並被迫使用指針,在C++ 11你應該考慮使用智能指針代替:
std::shared_ptr<X> x = std::make_shared<X>();
智能指針照顧的內存管理問題,這是WH在給你頭痛的生指針。智能指針,其實幾乎相同,Java或C#對象引用。該「幾乎」是必要的,因爲程序員必須通過擁有智能指針不引入循環依賴的照顧。
2)如果我創建像實施例示例對象;如何在單例類中使用它。
你可以做這樣的事情(簡化代碼):
struct Example
{
static Example& instance()
{
static Example example;
return example;
}
private:
Example() { }
Example(Example const&) = delete;
Example(Example&&) = delete;
Example& operator = (Example const&) = delete;
Example& operator = (Example&&) = delete;
};
可能會注意到,即使表達式沒有大括號,也會調用空構造函數。 – jiggunjer 2015-07-03 07:22:45