对象的复制操作
定义一个C++类对象的时候,就是调用类的构造函数,创建一个对象。假设有如下的student类:
classstudent{
public://定义成员变量
charname[32];//姓名
charaddr[32];//家庭地址
longlongnumber;//电话号码
public://以下部分是公有部分
student(char*pn,char*pa,longlongn)
{
strcpy(name,pn);
strcpy(addr,pa);
number=n;
}
voidprint()const
{
cout"name="nameendl;
cout"addr="addrendl;
cout"number="numberendl;
}
};
那么,可以定义一个对象,如下:
studentstud("wkf","xxx.mylinux.vip",xxx);
此时,定义了stud对象。那么,能否使用stud对象来创建一个新的类对象?例如:
studentstud1(stud);
就是使用stud对象来创建stud1对象。这种方法是允许的,这就是我们本节介绍的:对象复制。
C++提供了这样的克隆机制,就是“对象的复制机制”。用一个已有的对象快速地复制出多个完全相同的对象,其一般格式为:
类名对象2(对象1);
就是在定义对象2的时候,用对象1复制出对象2。
要实现这个操作,我们需要给C++类定义一个特殊的构造函数,称为:拷贝构造函数(copyconstructor),这个函数的形式如下:
构造函数名(需要拷贝对象的引用);
假设有一个student类,那么,定义其拷贝构造函数如下:
student(conststudents)
此时,定义一个student类的拷贝构造函数,拷贝构造函数的参数是需要拷贝对象的引用。那么,为了保护引用对象的数据,我们一般声明为const类型的引用。
拷贝构造函数也是构造函数,但是,它只有一个参数,这个参数是本类的对象(不能是其他类的对象),而且,参数对象的引用形式(一般约定加const声明,使参数值不能改变,以免在调用此函数时因不慎而使对象值被修改),此拷贝构造函数的作用就是将实参对象的各个成员变量的值一一赋给新的对象中对应的成员变量。
注意:定义一个C++类的时候,如果用户没有自己定义拷贝构造函数,那么,编译系统为C++提供了一个默认的拷贝构造函数,这个默认的拷贝构造函数很简单,如同默认的赋值运算一样,只是把对象之间的成员变量进行一一对应赋值。如下是一个程序测试例子:
可以看的,我们定义了一个stud对象,然后,执行:
studentstud1(stud);
此时,定义一个stud1对象,就是使用stud对象来复制,复制得到stud1对象。在上面的例子中,我们没有定义拷贝构造函数,那么,就使用系统默认提供的拷贝构造函数,实现对象成员的一一对应赋值。