拷贝构造函数

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 。所以总共调用了六次析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值