2014-07-16 86 views
0

我是C++的新手,我被問到一個問題,我實際上無法回答:什麼時候是重載或定義C++自己的拷貝構造函數的最佳時機?什麼時候最好定義一個拷貝構造函數

+0

拷貝構造函數的目的是創建對象的副本。如果默認的複製構造函數沒有正確地創建一個副本,那麼你應該禁用它,或者編寫你自己的一個能夠正確創建副本的副本。如果你永遠不需要複製你的對象,你可以禁用它。 –

+0

當您在複製/共享時管理需要特殊處理的資源時,也是必要的。一些背景信息:http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)和http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization – Enigma

回答

0

如果您的實例需要深度複製,那麼您必須定義複製構造函數。複製構造函數只做淺拷貝。 舉個例子,如果你的類有一個char指針。

請參閱此代碼示例。

#include <iostream> 
using namespace std; 

class Student 
{ 
public: 
    char * m_name; 
    int m_age; 
    Student(char* name, int age){ 
     int name_len = strlen(name)+1; 
     m_name= new char[name_len]; 
     strncpy(m_name, name, name_len); 
     m_age = age; 
    } 
}; 

int main() 
{ 
    char* firstStudent = "Kevin stefan"; 
    Student kevin(firstStudent,1); 

    Student jhon = kevin; 
    char* secondStudent = "Jhon Mac"; 
    strncpy(jhon.m_name,secondStudent,strlen(secondStudent)); 

    cout << kevin.m_name << endl; 

    system("pause"); 
    return 0; 
} 

該程序的結果打印Jhon Macefan。因爲兩個Student實例都指向相同的內存位置,因爲它的淺拷貝。

在這種情況下,你必須定義一個copy constructor深拷貝這樣

Student::Student(const Student& stu) 

    { 
     int name_len = strlen(stu.m_name);  
     m_name = new char[name_len+1]; 
     strncpy(m_name, stu.m_name, name_len); 

     m_age = stu.m_age; 
    } 
+0

我認爲這個答案只會導致人們混淆,即使你的例子是有效的。作爲一個反例,如果實例包含'vector ',那麼我(我懷疑,大多數)會調用默認的拷貝構造函數做深層拷貝。 – hvd

+1

C++並沒有真正的「深層複製」和「淺層複製」。要麼副本做你想要的或不要的。如果所指的資源不打算由班級刪除,所謂的「淺拷貝」可能是正確的。 –

+0

@MattMcNabb這個答案確實覆蓋了一個問題:「如果你的實例需要深度拷貝」 - 它已經承認有一些類不需要它。 – hvd

相關問題