您的位置:

C++ 拷贝构造函数详解

一、拷贝构造函数概述

拷贝构造函数是一种特殊的构造函数。当用同一类的一个对象去初始化另外一个对象时,就会调用拷贝构造函数。拷贝构造函数通常用于创建一个新对象,它初始化为另一个同类对象的副本。

//拷贝构造函数的定义
ClassName(const ClassName &obj) {
   // 对象定义
}

二、浅拷贝和深拷贝

在使用拷贝构造函数时,需要注意浅拷贝和深拷贝的问题。

浅拷贝仅仅是拷贝指针,因此两个对象的指针指向同一个内存空间,如果其中一个对象发生了改变,另一个对象的值也会跟着改变,这样会产生很多意想不到的问题。

深拷贝会将对象的值复制一份到新的内存地址中,因此两个对象的值不会相互影响。

//浅拷贝的实现
ClassName(const ClassName &obj) {
   ptr = obj.ptr;
}
//深拷贝的实现
ClassName(const ClassName &obj) {
   ptr = new int;
   *ptr = *obj.ptr;
}

三、调用拷贝构造函数的情况

以下是调用拷贝构造函数的典型情况:

  1. 使用同一类的对象来初始化新对象。
  2. 值传递的方式给函数参数传值。
  3. 函数返回一个对象。

四、拷贝构造函数在类继承中的应用

在类的继承中,如果派生类没有定义自己的拷贝构造函数,那么会调用基类的拷贝构造函数。

//基类构造函数的定义
BaseClass(const BaseClass &obj) {
    // 对象定义,注意是基类对象
}
//派生类的定义
DerivedClass(const DerivedClass &obj) : BaseClass(obj) {
    // 派生类对象初始化
}

五、拷贝构造函数的注意事项

  1. 拷贝构造函数的参数应该是常量引用。
  2. 拷贝构造函数应该是公有的。
  3. 拷贝构造函数不应该递归调用。
  4. 拷贝构造函数的实现应该考虑浅拷贝和深拷贝的问题。

六、完整代码示例

// 拷贝构造函数示例代码
#include<iostream>
using namespace std;
class Example {
    public:
        int *ptr;
        Example(int i) {
            ptr = new int(i);
        }
        ~Example() {
            delete ptr;
        }
        // 拷贝构造函数的定义
        Example(const Example &obj) {
            ptr = new int;
            *ptr = *obj.ptr;
            cout << "调用拷贝构造函数" << endl;
        }
};
void display(Example obj) {
    cout << "obj的值为 " << *obj.ptr << endl;
}
int main() {
    Example obj1(10);
    display(obj1);
    Example obj2 = obj1; //调用拷贝构造函数
    cout << "obj2的值为 " << *obj2.ptr << endl;
    return 0;
}