在 C++ 中,拷贝函数(copy constructor)是一种特殊的构造函数,用于创建一个对象并将其初始化为另一个同类型的对象。当我们以某个类型的对象作为另一个同类型对象的实参时,拷贝函数会被自动调用。C++ 中的拷贝函数有以下两种形式:
-
默认拷贝函数
默认情况下,C++ 会自动生成一个默认的拷贝函数。此函数执行逐个成员变量的拷贝操作,没有额外的工作。下面是一段使用默认拷贝函数的示例代码:
#include <iostream>
using namespace std;
class Point {
public:
int x, y;
Point() { x = 0; y = 0; } // 默认构造函数
};
int main() {
Point p1;
// 使用默认拷贝函数
Point p2 = p1;
return 0;
}
在以上代码中,由于没有定义 Point 类的拷贝函数,因此编译器将使用默认拷贝函数进行拷贝操作。
-
自定义拷贝函数
如果需要执行特定的内存分配或其他操作,我们可以自定义拷贝函数以替换默认拷贝函数。自定义拷贝函数通常具有以下形式:
类名(const 类名 &obj) { // 拷贝构造函数体 }
其中 类名
表示要拷贝的对象类型,const 类名 &obj
表示拷贝一个常量引用类型的 obj
参数。以下是一个自定义拷贝函数的示例代码:
#include <iostream>
using namespace std;
class Point {
public:
int x, y;
Point() { x = 0; y = 0; } // 默认构造函数
Point(int a, int b) { x = a; y = b; }
// 自定义拷贝函数
Point(const Point &obj) {
x = obj.x + 1;
y = obj.y + 1;
}
};
int main() {
Point p1(1, 2);
// 使用自定义拷贝函数
Point p2 = p1;
cout << p1.x << ", " << p1.y << endl; // 1, 2
cout << p2.x << ", " << p2.y << endl; // 2, 3
return 0;
}
在以上代码中,我们通过自定义拷贝函数实现了从 p1
到 p2
的拷贝操作。拷贝函数采用常量引用作为输入参数,并执行了特定的逻辑以生成新的对象。
需要注意的是,在类的析构函数中使用动态内存分配时,我们必须对自定义的拷贝函数进行更加谨慎的设计和调试,以避免产生内存泄漏或重复释放等问题。