C++中允许同类型变量之间的赋值,例如int a = 100; int b = a. 对象是一种复杂的类类型,程序中有时需要用一个已知对象去创建另一个对象,或将一个对象赋值给另一个对象,就像使用简单类型变量之间赋值一样。
例如:
Cdate day1(1991,1,1),day2;
Cdate day3(day1); //用一个对象初始化另一个对象
fun(Cdate day); //函数声明,函数的参数是一个类对象
fun(day1); //函数调用,对象作为函数的参数
对象之间的初始化时由类的拷贝构造函数完成的。拷贝构造函数式一种特殊的构造函数,它的作用是用一个已知的对象来初始化另一个对象。拷贝构造函数与类同名,没有返回类型,只有一个参数,参数为该类对象的引用。拷贝构造函数格式为:
类名::拷贝构造函数名(类名 &引用名)
例如:
Tdate::Tdate(Tdate &d); //形参是一个对象的引用
CString(const CString &stringSrc); //形参是一个const的对象引用
通常在下述三种情况下,需要用拷贝初始化构造函数:
(1)明确表示由一个对象初始化另一个对象时,如Cdate day3(d1);
(2)当对象作为函数实参传递给函数形参时,如fun(Cdate day);
(3)当对象作为函数的返回值,创建一个临时对象时。
如果用户没有自定义拷贝构造函数,那么编译系统会自动提供一个默认的拷贝构造函数。默认的拷贝构造函数所做的工作是,将一个对象的全部数据成员赋值给另一个对象的数据成员。C++把这种只进行对象数据成员简单赋值称为“浅拷贝”。
当类的数据成员中包括动态分配的资源时,如果只做数据成员之间的简单赋值(浅拷贝),就会出现问题,用户必须自定义拷贝构造函数。