2012-03-23 93 views
1

我從來沒有寫過拷貝構造函數,所以爲了避免痛苦,我想知道我編碼是否合法。它編譯,但我不確定它作爲一個拷貝構造函數應該。C++在複製構造函數中使用const?

而且我要在拷貝構造函數使用const或我可以簡單地將其刪除。 (我不喜歡const的是,如果我使用一些非const函數,編譯器會哭)。

//EditNode.h 
class EditNode 
{ 
     explicit EditNode(QString elementName); 
     EditNode(const EditNode &src); 
} 

//EditNodeContainer.h 
class EditNodeContainer : public EditNode 
{ 
     explicit EditNodeContainer(QString elementName); 
     EditNodeContainer(const EditNodeContainer &src); 
} 

//EditNodeContainer.cpp 
EditNodeContainer::EditNodeContainer(QString elementName):EditNode(elementName) 
{ 
}  

//This seems to compile but not sure if it works 
EditNodeContainer::EditNodeContainer(const EditNodeContainer &src):EditNode(src) 
{ 

} 


//the idea whould be to do something like this 
EditNodeContainer *container1 = new EditNodeContainer("c1"); 
EditNodeContainer *copyContainer = new EditNodeContainer(container1); 
+0

你的拷貝構造函數不會做任何事情,編譯器生成一個沒有做。 – 2012-03-23 23:24:18

+0

是否有某些原因需要編寫自定義副本構造函數?在很多情況下,默認的應該沒問題。 – Philipp 2012-03-23 23:25:21

+0

即當你要複製的數據從一個成員指出,而不是指針本身 – kappa 2012-03-23 23:27:27

回答

3

複製構造是,具有以下特徵中的一個的構造:

class A 
{ 
    A(A& other); 
    //or 
    A(const A& other); 
    //or 
    A(volatile A& other); 
    //or 
    A(const volatile A& other); 
    //or any of the above + other parameters that have default arguments 
    //example: 
    A(const A& other, int x = 0) //this is also a copy constructor 
}; 

以上是在標準的12.8.2指定 - C++ 03。 所以你正在實現一個複製構造函數。

應該收到const參數的原因是,你不改變你抄襲的對象。如果你在它上面調用非const函數,那麼你做錯了什麼。

此外,在您的片斷

EditNodeContainer *container1 = new EditNodeContainer("c1"); 
EditNodeContainer *copyContainer = new EditNodeContainer(container1); 

你不調用拷貝構造函數,因爲你傳遞一個EditNodeContainer*作爲參數,而不是一個EditNodeContainer

1

你錯過了一個*符號。複製構造函數期望引用對象,但被賦予指向對象的指針。只需將container1替換爲*container1作爲複製構造函數的參數即可。

+0

你是對的,因爲container1是一個指針,所以他需要去引用它 – kappa 2012-03-23 23:29:00

0

複製構造函數的參數可以是對非const的左值引用或對const的左值引用,但實際上它始終是對const的引用(已棄用auto_ptr是個例外)。

,除非你要和你完全瞭解其後果你不應該寫一個拷貝構造函數。如果您隨時都在使用RAII類,那麼您很少需要自定義的拷貝構造函數(除非您正在編寫RAII類)。

另外,請避免裸指針和new儘可能。