拷贝构造函数
我们经常会用一个变量去初始化一个同类型的变量,那么对于自定义的类型也应该有类似的操作,那么创建对象时如何使用一个已经存在的对象去创建另一个与之相同的对象呢?
构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用
拷贝构造函数是构造函数的一个重载,因此显式的定义了拷贝构造,那么编译器也不再默认生成构造函数。
特征
拷贝构造也是一个特殊的成员函数
特征如下:
- 拷贝构造是构造函数的一个重载;
- 拷贝构造的参数只有一个并且类型必须是该类的引用,而不是使用传值调用,否则会无限递归;
- 若没有显式定义拷贝构造函数,编译器会自己生成一个默认拷贝构造,默认的拷贝构造函数对象按按内存存储和字节序完成拷贝,也叫浅拷贝;
class Date
{
public:
Date(int year, int month, int day)
:
_year(year),
_month(month),
_day(day)
{
}
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2001, 7, 28);
Date d2(d1);
d1.Display();
d2.Display();
return 0;
}
输出:
2001-7-28
2001-7-28
- 对于那些直接管理着内存资源的类(含有指针变量),那么简单的值拷贝还顶得住吗?显然顶不住啊。
通过图示说明:
两个string类的对象指