2014-10-02 70 views
-3
#include <iostream> 
#include <string> 
class MyClass{ 
public: 
    MyClass(){ 
     std::cout << "Called Constructer A \n"; 
    } 
    MyClass(int n){ 
     std::cout << "Called Constructer B \n"; 
    } 
}; 
int main(){ 
    MyClass a(); //It's not works as expect 
    MyClass b(0); //But this works 
    MyClass c; 
    MyClass d = MyClass(); 
    MyClass e = MyClass(0); 

} 

那麼,如何從e不同b,爲什麼b作品,但不a這些對象初始化之間有什麼不同?

+7

可能是幾個問題的副本 – CashCow 2014-10-02 12:18:53

+0

好 - 不僅需要一個答案,而且對於我們來說這個問題! – 2014-10-02 12:20:23

+2

請參閱http://stackoverflow.com/q/24953658/981959和[標籤:最棘手的解析]。請在創建新問題之前進行搜索 – 2014-10-02 12:23:12

回答

2

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&); 
}; 

編譯器會抱怨與創建de

在行C++ 11

class MyClass { 
     // etc. 

     // this can be public too 
     MyClass(MyClass&&) = delete; 
}; 

將調用當您嘗試創建de時出現編譯器錯誤「使用已刪除的函數」。 私人拷貝構造函數也將產生錯誤,除非你做的事:

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」從未打印過。編譯器可以(並且)優化它。但它必須可以訪問。

相關問題