拷贝构造函数的语法
拷贝构造函数是构造函数的重载,
用于这种情况:用已经构造好的对象去给另一个对象初始化。
int main()
{Date d1(2024, 8, 1);Date d2(d1);//用d1初始化d2return 0;
}
我们以Date类为例子讲解一下。
class Date
{
public://全缺省构造函数Date(int year = 2000, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//拷贝构造函数Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}~Date(){}
private:int _year;int _month;int _day;
};
语法格式为:
类名 + ‘(’ + const + 类名 + 引用符号& + 形参名字 + ‘)’ + { }。
{}里面就让成员变量等于传入的对象d的成员变量。
说人话就是,1:1复刻传入的对象d.
拷贝构造函数的实用之处
d1和d2的成员变量的地址是一样的,
让我们给Date类增加一个变量
调试时就会发现两个指针变量a地址一样,
析构函数释放同一块空间2次,程序就会崩掉。
正确写法
class Date
{
public://全缺省构造函数Date(int year = 2000, int month = 1, int day = 1){_year = year;_month = month;_day = day;a = (int*)malloc(sizeof(int) * 3);}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;//a = d.a; // 错误写法a = (int*)malloc(sizeof(int) * 3);memcpy(a, d.a, sizeof(int) * 3);}~Date(){free(a);a = nullptr;}
private:int _year;int _month;int _day;int* a;
};