千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了C++的拷贝构造函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。拷贝构造函数用以将一个类的对象拷贝给同一个类
千家信息网最后更新 2026年10月31日C++的拷贝构造函数是什么

这篇文章主要介绍了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++的拷贝构造函数是什么"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

拷贝 函数 对象 内存 篇文章 情况 指针 数据 空间 生成 C++ 内容 周期 字符 就是 时调 生命 用以 用户 类型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 湖南永感互联网科技有限公司 科技创新与互联网经济 新华互联网科技学院 河南真二互联网科技有限公司 互联网为科技 互联网科技logo 多迪互联网科技有限公司 银川新华互联网科技职业技术培训学校图片 中化能源互联网科技招聘 科技互联网大厂 华夏互联网科技业 江阴互联网智能科技产品进口 烟台灵鸽互联网科技有限公司 互联网科技圈年度人物 元气玛特互联网科技公司是外包吗 21世纪互联网科技成就 北京天晋互联网科技有限公司 陕西彩京云互联网科技有限公司 上海互联网科技园景观 互联网科技视频 左右互联网络科技 卓越科技互联网 招聘 北京大学互联网科技怎么样 互联网系的金融科技公司 湖南诚度互联网科技有限公司 玉溪新华互联网科技好不好 卓翼科技产业互联网合作 工业互联网展湾科技股份有限公司 互联网科技包装股份有限公司上市
0