拷贝构造函数的语法
拷贝构造函数是构造函数的重载,
用于这种情况:用已经构造好的对象去给另一个对象初始化。
int main()
{
Date d1(2024, 8, 1);
Date d2(d1);//用d1初始化d2
return 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;
};