本文共 1761 字,大约阅读时间需要 5 分钟。
在C++中,复制构造函数是一种特殊的构造函数,用于利用一个已有的对象来初始化另一个同类型的对象。它通常用于对对象进行拷贝操作。与普通构造函数不同,复制构造函数接受一个本类类型的常引用参数。
int a = 10; int b = a;
类似地,对象的初始化也可以通过复制实现。例如 point pt1(10, 20); point pt2 = pt1;
。复制构造函数的定义形式如下:
类名(const 类名 & obj) { // 初始化新对象}
例如,对于 Point
类:
class Point {private: int x, y;public: Point() : x(0), y(0) {} // 默认构造函数 Point(const Point & r) : x(r.x), y(r.y) {} // 复制构造函数 Point(int a, int b) : x(a), y(b) {} // 带参数构造函数};
const
限定词:复制构造函数只能接受常引用,以保证传递的对象不会被修改。point pt2 = pt1;
会隐式调用复制构造函数。每个类都有一个复制构造函数。如果类没有定义复制构造函数,编译器会自动生成一个合成复制构造函数。其操作如下:
例如,对于一个 Vector<int>
类:
Vector vec1(10);Vector vec2 = vec1;
这里的 vec2
通过复制构造函数生成,并复制了 vec1
的所有成员包括元素值和数组大小。
浅复制:仅复制对象的成员变量值,不处理外部资源(如堆中的指针)。
class CA {private: int a; char *str;public: CA(int b, char *cstr) { a = b; str = new char[b]; strcpy(str, cstr); } CA(const CA & C) { str = new char[C.a]; strcpy(str, C.str); }};
这里的 CA
类成员 str
是通过浅复制实现的,因为动态内存分配 (new
) 没有被复制。
深复制:不仅复制成员变量的值,还复制对象相关的资源。
class CA {private: int a; char *str;public: CA(int b, char *cstr) { a = b; str = new char[b]; strcpy(str, cstr); } CA(const CA & C) { a = C.a; if (str != 0) { str = new char[a]; // 深复制 strcpy(str, C.str); } }};
这里的 CA
类通过 new
分配内存的成员 str
才进行了深复制。如果 str
由动态内存分配管理,深复制会更加复杂。
通过以上内容,你可以更好地理解复制构造函数及其在C++中的应用。
转载地址:http://zfwuk.baihongyu.com/