a
被聲明爲返回一個MyClass的
b
是與一個int參數
c
構建以正常的方式是不帶參數
d
需要構建正常方式的功能可訪問的複製(/移動) - 構造器,從技術上講,它將RHS上的臨時文件複製到d
,但編譯器可能實際上不會調用它。
e
是相同的,但使用int構造函數。如果你沒有
MyClass e = 0;
這也將需要的構造函數,使int是非顯式的。
要回答「e如何與b不同」的問題。這兩個對象是相似的,但如果您的類沒有可訪問的複製/移動構造函數,則與e
一起使用的構造將無法編譯。 (在C++ 11中移動構造函數)
b似乎沒有聲明函數,所以不會像a一樣失敗。
在C++ 03,如果你把在
class MyClass {
// etc.
private:
MyClass(const MyClass&);
};
編譯器會抱怨與創建d
和e
在行C++ 11
class MyClass {
// etc.
// this can be public too
MyClass(MyClass&&) = delete;
};
將調用當您嘗試創建d
和e
時出現編譯器錯誤「使用已刪除的函數」。 私人拷貝構造函數也將產生錯誤,除非你做的事:
class MyClass{
public:
MyClass(){
std::cout << "Called Constructer A \n";
}
MyClass(int n){
std::cout << "Called Constructer B \n";
}
MyClass(MyClass const&) = delete; // cannot copy
MyClass(MyClass &&) = default; // but you CAN move
};
現在你的代碼進行編譯。
雖然我們是在C++ 11構造的對象,你也可以有:
MyClass f{}; // not a function
MyClass g{1};
MyClass h = MyClass{};
MyClass i = MyClass{0};
MyClass j = {};
MyClass k = {0};
需要注意的是,如果我改變我的移動構造函數(目前=默認值)
MyClass(MyClass &&)
{
std::cout << "Moved\n";
}
我試過了,「Moved」從未打印過。編譯器可以(並且)優化它。但它必須可以訪問。
可能是幾個問題的副本 – CashCow 2014-10-02 12:18:53
好 - 不僅需要一個答案,而且對於我們來說這個問題! – 2014-10-02 12:20:23
請參閱http://stackoverflow.com/q/24953658/981959和[標籤:最棘手的解析]。請在創建新問題之前進行搜索 – 2014-10-02 12:23:12