📜  C++中的复制构造函数(1)

📅  最后修改于: 2023-12-03 14:39:58.157000             🧑  作者: Mango

C++中的复制构造函数

在C++中,复制构造函数(Copy Constructor)是一种特殊的构造函数,用于创建一个新的对象,该对象完全复制另一个同类型对象的值。复制构造函数通常以引用方式传递参数,并按值复制它所引用的对象的内容。复制构造函数在以下情况下被调用:

  1. 通过使用一个对象初始化另一个对象时
  2. 将对象作为函数参数按值传递
  3. 从函数返回对象时
功能与语法

复制构造函数用于创建一个与现有对象具有相同值的新对象。它的语法如下所示:

class MyClass {
public:
    // 复制构造函数
    MyClass(const MyClass& obj) {
        // 复制obj的成员变量到当前对象
    }
};
调用复制构造函数的情况
1. 通过使用一个对象初始化另一个对象时
MyClass obj1;         // 创建一个对象 obj1
MyClass obj2(obj1);   // 使用 obj1 初始化 obj2,调用复制构造函数

在这种情况下,复制构造函数将调用并将 obj1 的成员变量复制到 obj2。

2. 将对象作为函数参数按值传递
void doSomething(MyClass obj) {
    // 对 obj 进行操作
}

int main() {
    MyClass obj1;
    doSomething(obj1);   // 调用 doSomething() 函数并传递 obj1,复制构造函数将被调用
    return 0;
}

在这种情况下,传递给函数 doSomething() 的参数 obj 会调用复制构造函数以创建一个新的 MyClass 对象。这个新对象将与原始对象具有相同的值。

3. 从函数返回对象时
MyClass createObject() {
    MyClass obj;
    // 对 obj 进行一些操作
    return obj;   // 返回 obj,复制构造函数将被调用
}

int main() {
    MyClass obj1 = createObject();   // 调用 createObject() 函数并返回一个对象,复制构造函数将被调用
    return 0;
}

在这种情况下,函数 createObject() 在返回对象之前调用并创建一个对象的副本。这个副本将成为主调函数中的新对象实例。

避免默认复制构造函数

如果没有自定义的复制构造函数,C++会提供一个默认的复制构造函数。默认复制构造函数执行浅复制,即复制指针而不是创建指向新内存的新指针。这可能导致意外的副作用,因为在两个对象之间共享相同的内存地址。

因此,在需要深复制对象的情况下,我们应该自定义复制构造函数,以确保正确复制对象的成员变量。

总结

复制构造函数是一种特殊的构造函数,用于创建一个新的对象,该对象完全复制另一个同类型对象的值。它可以通过对象初始化、按值传递函数参数和从函数返回对象等方式调用。自定义复制构造函数可确保正确复制对象的成员变量,并避免意外浅复制的副作用。