首页 > 作文

C++中的拷贝构造详解

更新时间:2023-04-04 15:05:33 阅读: 评论:0

目录
拷贝构造函数拷贝构造中的引用什么情况会使用拷贝构造总结

拷贝构造函数

同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完美可行的,这个拷贝过程只需要拷贝数据成员,而函数成员是公用的(只有一份代码);在建立对象时可用同一类的另一个对象来初始化该对象的存储空间,这时所用的构造函数称为拷贝构造函数

例如:

class object{int value;public:object(int x = 0) :value(x) {}~object() {}object(object& obj):value(obj.value){cout << "copy create" << endl;}};int main(){object obja(10);object objb(obja);//一个对象初始化另一个对象空间,调用拷贝构造}

当一个对象去初始化另一个对象空间,调用拷贝构造;若类中没有写拷贝构造,如同构造函数与析构函数一样,系统会生成一个缺省的拷贝构造函数

object(object& obj){}

拷贝构造中的引用

如果我们在写的拷贝构造不加引用,这样会引起死递归

//object(object& obj):value(obj.value)object(object obj):value(obj.value){cout << "copy create" << endl;}

为什么拷贝构造函数必须采用引用传参,否则会引发无穷递归呢?

这个问题其实很简单,再复制对象时要分为两个步骤:

第一步:开辟一个临时空间;

第二步:由于临时空间是需要构造的,重新调用拷贝构造函数(无穷递归形成…)

同时我们可以在拷贝构造参数前加上一个引用,来限制可能会出现的问题

//object(object& obj):value(obj.value)object(const object& obj):value(obj.value){cout << "copy create" << endl;}//这里的const修饰,令我们不能修改被请为我喝彩拷贝对象

什么情况会使用拷贝构造

拷贝构造不止在使用一个对象去构造另一个对象时调用,在下面这些情况也会调用:

class object{int value;public:object(){cout << "object::object" << this << endl;}object(int x = 0) :value(x){cou趣味知识竞赛t << "object::object" << this << endl;}~object(){cout << "objecet::~object" << this << endl;}object(object& obj) :value(obj.value){cout << "copy create" << this << endl;}void tvalue(int x) { value = x; }int getvalue() const { return value; }};object fun(object obj){int val = obj.getvalsparksfly歌词ue();object obja(val);return obja;}int main(){object objx(0);object objy(0);objy = fun(objx);return 0;}class object{int value;public:object(){cout << "object::object" << this << endl;}object(int x = 0) :value(x){cout << "object::object" << this << endl;}~object(){cout << "objecet::~object" << this << endl;}object(object& obj) :value(obj.value){cout << "copy create" << this << endl;}void tvalue(int x) { value = x; }int getva营销和销售lue() const { return value; }};object fun(object obj){int val = obj.getvalue();object obja(val);return obja;}int main(){object objx(0);object objy(0);objy = fun(objx);return 0;}

在上面这一段代码中,我们总共创建了几个对象呢,我们来看一下

首先①②属于对象的构造,调用构造函数;程序运行到objy = fun(objx);进入到fun函数,这是构造临时对象obj③属于拷贝构造;随后④构造对象obja;最后⑤这里也属于拷贝构造也需要创建一个三国马忠临时对象(将亡值)

并且我们无法将fun函数中obja对象之间return传回给objy,因为在函数结束时obja会析构失效,所以这里会创建一个新的临时对象

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!

本文发布于:2023-04-04 15:05:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/aeacbf1b3e5255c2685ffb37f2c82954.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C++中的拷贝构造详解.doc

本文 PDF 下载地址:C++中的拷贝构造详解.pdf

标签:对象   函数   递归   初始化
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图