6.9 构造函数与析构函数的比较
|
1、 拷贝构造函数的定义: 拷贝构造函数是一种特殊的成员函数。该函数的功能是用一个已有的对象的值来初始化一个新构造的对象。拷贝构造函数实际上也是构造函数,它是在初始化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。 拷贝构造函数的定义格式为: < 类名 >::< 拷贝构造函数名 >(const < 类名 >&< 引用名 >) 其中 < 拷贝构造函数名 > 与类名相同。形参是一个该类的引用,且只能有一个形参。 2、 拷贝构造函数被调用的情况: ⑴用一个已知对象的值去初始化另一个对象。 例如: Tdate today(2001,12,1); Tdate tom=today; // 用 today 的值初始化 tom. ⑵对象作为函数的参数传递时,把实参对象的值传给形参对象。 ⑶当对象作为函数的返回值时,如 return W, 系统将调用对象 W 来初始化一个匿名对象,需要调用拷贝构造函数。 例如: void f1(Tdate d) { ….. } void main() { Tdate c; f1(c ); } 例 14 :对于上例的 employee 类,改写如下: #include<iostream.h> class employee { public: employee(char *na,char *street,char *city,char *di,char *po); employee(employee & qq); void changeName(char *); void display(); ~employee() { cout<<"Destructing object./n"; } protected: char *name; char *street; char *city; char *district; char *post; }; employee::employee(char *na,char *st,char *ci,char *di,char *po) { name=na; street=st; city=ci; district=di; post=po; } employee::employee(employee &qq) { name=qq.name; street=qq.street; city=qq.city; district=qq.district; post=qq.post; cout<<"Copy constructor function called/n"; } void employee::changeName(char *na) { name=na; } void employee::display() { cout<<name<<endl; cout<<street<<endl; cout<<city<<endl; cout<<district<<endl; cout<<post<<endl; } void main() { employee person1("Mary","Nan Jing Lu120","nanjing","Jiangsu","20002"); employee person2=person1; person2.display(); } 运行结果为: Copy structor function called. Mary Nan Jing Lu120 nanjing jiangsu 20002 destructing object. destructing object. 例 15 分析下列程序的输出结果。这里沿用例 14 的 employee 类。 #include<iostream.h> #include”employee.h” employee f1(employee q); void main() { employee person1(“Join”,” Beijing Road 220” , ” Beijing ”,”Zhixiashi”,” 10080” ); employee person2(“Nobody”,”No address”,”Nowhere” ,”Nodistrict”,” 00000” ); employee person3=person1; person2=f1(person3); person2.display(); } employee f1(employee q) { cout<<”this is function called./n”; employee r(“Wang Lan”,”gansulu”,”beijing”,”Zhixiashi”,” 10020” ); r=q; return r; } 运行结果: Copy constructor function called. Copy constructor function called. this is function called. Copy constructor function called. Destructing object. Destructing object. Destructing object. Join Beijing Road 220 Beijing Zhixiashi 10080 Destructing object. Destructing object. Destructing object. 说明:从该程序的输出结果可以看出: • 拷贝构造函数共使用了三次。第一次是执行 employee person3=person1; 语句时,对对象 person3 初始化。第二次是在调用函数 f1() 函数时,实参 person3 给形参 q 进行初始化时,即实参向形参传递值时。第三次是在执行 f1() 函数中的返回语句 return rl; 时,系统用返回值初始化一个匿名对象时使用了拷贝构造函数。 • 析构函数一共调用了六次。在退出 f1() 函数时,该函数中定义的对象将被释放,系统自动调用其析构函数。共调用了二次,用来析构对象 q 和 r 。在返回主函数 main() 后,用赋值运算符将其匿名对象的值赋给对象 person2 ,然后释放匿名对象,这是又调用一次析构函数。最后退出整个程序时,又调用了三次析构函数,分别释放主函数中定义的对象 person3,person2,person1 。所以总共调用了六次析构函数。 |
拷贝构造函数
最新推荐文章于 2022-04-16 11:00:19 发布