文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++的拷贝构造函数是什么

2023-06-29 14:20

关注

这篇文章主要介绍了C++的拷贝构造函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

拷贝构造函数用以将一个类的对象拷贝给同一个类的另一个对象,比如之前学习过的string类:

string s1;string s2 = s1;

一般情况下的拷贝构造函数:

class A{private:int n;double d;char s;public:A(const A& a);};A::A(const A& a){this->n = a.n;this->d = a.d;this->s = a.s;}

即按照数据类型开辟一段内存空间用以存放拷贝进来的对象的数据。需要注意的是必须传递进来的是类的引用,如果是按值传递,将会生成一个临时的类的对象a,并将传递进来对象拷贝给临时对象,其实就是又调用了拷贝构造函数。

默认拷贝构造函数:

如果用户没有自定义拷贝构造函数,又使用了对象的拷贝,则编译器会自动生成一个默认构造函数,格式同上。

浅拷贝和深拷贝:

大多数情况下,使用默认构造函数就可以完成对象的拷贝(浅拷贝),但是当对象中有诸如指针、动态数组等数据类型时使用默认构造函数则可能出错,此时需要用户自定义拷贝构造函数(深拷贝),以下是一个例子,首先是没有自定义拷贝构造函数的情况:

class A{private:char* str;int len;public:A(const char* s);~A();//A(const A& a);};A::A(const char* s){len = strlen(s);str = new char[len+1];strcpy(str, s);cout << str << " object construct." << endl;}A::~A(){cout << str << " deleted." << endl;delete[]str;}//A::A(const A& a)//{//this->len = a.len;//this->str = new char[a.len+1];//strcpy(str, a.str);//}

调用函数:

int main(void){A a1("Hello");A a2 = a1;return 0;}

运行结果:

Hello object construct.
Hello deleted.
葺葺葺葺葺葺葺葺攐? deleted.

这是因为在对象复制的时候,由于编译器生成了默认拷贝构造函数,只是单纯的将a1中指针str的值赋值给a2中的指针str,导致a2的生命周期结束时调用析构函数将str指向的内存空间内容释放掉了,于是a1生命周期结束时调用析构函数释放掉的内存中的内容就是无意义的字符了。

去掉注释后的正确写法:

class A{private:char* str;int len;public:A(const char* s);~A();A(const A& a);};A::A(const char* s){len = strlen(s);str = new char[len+1];strcpy(str, s);cout << str << " object construct." << endl;}A::~A(){cout << str << " deleted." << endl;delete[]str;}A::A(const A& a){this->len = a.len;this->str = new char[a.len+1];strcpy(str, a.str);}

调用函数同上。

运行结果:

Hello object construct.
Hello deleted.
Hello deleted.

这里自定义了拷贝构造函数,申请了一块新的内存空间来存放拷贝进来的字符串,因此释放时就不会出错了。

感谢你能够认真阅读完这篇文章,希望小编分享的“C++的拷贝构造函数是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯