千家信息网

C++中的拷贝构造是怎样的

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这期内容当中小编将会给大家带来有关C++中的拷贝构造是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。拷贝构造函数同一个类的对象在内存中有完全相同的结构,如果作
千家信息网最后更新 2025年11月07日C++中的拷贝构造是怎样的

这期内容当中小编将会给大家带来有关C++中的拷贝构造是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

拷贝构造函数

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

例如:

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){cout << "Object::Object" << this << endl;}~Object(){cout << "Objecet::~Object" << this << endl;}Object(Object& obj) :value(obj.value){cout << "Copy Create" << this << endl;}void SetValue(int x) { value = x; }int GetValue() 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;}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 SetValue(int x) { value = x; }        int GetValue() 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会析构失效,所以这里会创建一个新的临时对象

上述就是小编为大家分享的C++中的拷贝构造是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

拷贝 对象 函数 空间 递归 C++ 代码 内容 情况 成员 问题 分析 可行 相同 专业 两个 中小 之间 会创 内存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么把安装包拷贝到其他服务器上 网络安全黑板报高难度 cors系统软件开发 java数据库高阶面试题 北京软件开发外包公司发展情况 华为招计算机网络技术人员吗 青州中医院网络安全 网络安全硬件和ip 数据库中的什么能够唯一标识 数据库进入文件夹下 我的世界买哪个版本服务器 周口软件开发培训机构 珙县网络安全检查 软件从wincc上取数据库 32岁学数据库技术 电影票房数据库技术移民 武汉阿拉丁网络技术 高三网络技术应用知识点视频 网络安全进社区致辞 我的世界紫霄服务器 java数据库高阶面试题 山西通用软件开发性价比 双阳区正规网络技术服务推荐咨询 软件开发自动化部署 党政信息网络安全技术 中信软件开发部待遇怎么样 银行的数据库是什么类型 福建pdu服务器电源批发厂家 域名系统的四个服务器的区别 腾讯云轻量应用服务器搭建派节点
0