2014-07-16 49 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

相关问题