什么时候最好定义一个复制构造函数 我是C++的新手,我被问到一个我真的不能回答的问题:什么时候是在C++中重载或定义自己的复制构造函数的最佳时间?

什么时候最好定义一个复制构造函数 我是C++的新手,我被问到一个我真的不能回答的问题:什么时候是在C++中重载或定义自己的复制构造函数的最佳时间?,c++,constructor,C++,Constructor,如果你的实例需要深拷贝,那么你必须定义复制构造函数。复制构造函数只执行浅层复制。 例如,如果您的类有一个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;

如果你的实例需要深拷贝,那么你必须定义复制构造函数。复制构造函数只执行浅层复制。 例如,如果您的类有一个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;
}

复制构造函数的目的是创建对象的副本。如果默认复制构造函数没有正确创建副本,那么您应该禁用它,或者编写自己的正确创建副本的构造函数。如果不需要复制对象,可以禁用它。在管理复制/共享时需要特殊处理的资源时,也需要禁用它。一些背景信息:我认为这个答案只会让人困惑,即使你的例子是正确的。作为一个反例,如果实例包含向量,那么我和我猜想,大多数调用默认拷贝构造函数做深拷贝的内容。C++没有真正的深度拷贝和浅拷贝。要么复印件符合你的要求,要么不符合你的要求。如果类不打算删除所指向的资源,则所谓的浅拷贝可能是正确的。@mattmcnab这个答案确实正确地涵盖了一件事:如果实例需要深拷贝,则它已经确认存在不需要它的类。
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;  
    }