9.8.2对象的复制

1:对象的复制:用一个已用的对象快速地复制出多个完全相同的对象。
2:一般形式:类名 对象2(对象1)
其它形式: 类名 对象名1=对象名2;
3:复制构造函数(copy constructor)
Box::Box(const Box&b)
{height =b.height;
width=b.width;
length=b.length;
}
4:复制构造函数也是构造函数不,它只有一个参数,这个参数是本类的对象(不能是其他类的对象),而且采用对象的引用形式(一般加const声明,使参数值不能改变,以免调用该函数时不小心改变实参对象)
5:对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值。而对象的复制是从无到有地建立一个新对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)
6:普通构造函数和复制构造函数的区别
(1)形式上
类名(形参表列);//普通构造函数的声明,如Box(int h,int w,int len);
类名(类名&对象名);//复制构造函数的声明,如Box(Box &b);
(2)在建立对象时,实参类型不同。系统会根据实参的类型调用普通的构造函数或者复制构造函数。
Box box1(12,13,14);//实参为整数,调用普通构造函数
Box box2(box1);//实参是对象名,调用复制构造函数
(3)普通构造函数在程序中建立对象时被调用
(4) 复制构造函数在已有对象复制一个新对象时被调用(需用到构造函数的三种情况如下)
A: 程序中需建立一个新的对象,并且用另一个同类的对象对他初始化。
B:当函数的参数为类的对象时,调用函数时需将实参对象完整地传递形参,也是需要建立一个实参的拷贝,这就是按实参复制的一个形参,系统是通过调用复制构造函数来实现的,保证形参和实参具有完全相同的值

void fun(Box b)//形参是类的对象
{}
int main()
{Box box1(12,15,18);
fun(box1);   //实参是类的对象,调用函数时将复制给一个新对象b 
return 0;
}

C:函数的返回值是类的对象。在函数调用完毕将返回值带回函数调用处,此时需将函数中的对象复制给一个临时对象并传给该函数的调用处。

Box f()            //函数f的类型为Box类的类型
{Box box1(12,15,18);
return box1;//返回值是Box类的对象
}
int main()
{Box box2;//定义Box类的对象box2
box2=f();//调用f函数,返回Box类的临时对象,并将它赋值给box2
return 0;
}

因为box1是在函数f中定义的,在调用f函数结束时,box1的生命周期就结束了,因此并不是将box1带回main函数,而是函数f结束前执行return语句,调用Box类中的复制构造函数,按box1复制给一个新的对象,然后将他赋值给box2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值