拷贝构造函数
概念
拷贝构造是赋值操作符 “=” 的深层赋值构造,用于自定义类型的赋值。
特性
- 函数名与类名相同
- 不能写返回值
- 功能与
operator=
相同,但是[[#^fa48f4|运用在不同的语境]]。 - 拷贝构造函数的参数类型是
Date(const Date& d)
,注意:此处的参数必须要用引用,必须用const修饰
代码示例
重点提要:拷贝构造函数用于初始化对象。也就是创建并赋值,调用拷贝构造函数。
operator=是“=”的操作符重载,用于非对象初始化的赋值。
^fa48f4
class Date
{
public:
Date(int year, int month, int day) // 构造函数
{
_year = year;
_month = month;
_day = day;
}
Date(const Date& d) // 拷贝构造
{
_year = d._year;
_month = d._month;
_day = d._day;
}
Date& operator=(const Date& d) // "="运算符重载
{
_year = d._year;
_month = d._month;
_day = d._day;
return *this;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
// 情况一:
Date d1(2024, 5, 28); // 初始化并赋值——调用普通构造函数
Date d2 = d1; // 初始化并赋值——拷贝构造
// 情况二:
// 方法一:
Date d3; // 先初始化
d3 = d2; // 再赋值,调用"="赋值重载
// 方法二:
Date d4; // 先初始化
d4.operator(d2); // 再用d2赋值给d4,调用"="赋值重载
return 0;
}
自定义类型的深拷贝
-
概述
- 编译器自带的默认拷贝构造函数只能实现赋值操作,而如果面对更复杂的对象的拷贝(数组等),需要动态内存分配的时候,编译器的默认拷贝构造是怎么做的呢?
class A { A(int n) :a = new int[n] {} A(A& d) { } private: int* a; }; int main() { A a1(10); A a2; return 0; }