C++——拷贝构造函数

背景

如果不提供位拷贝(浅拷贝),那么会造成一下问题

1、两个不同的指针指向同一块堆上资源,可能造成重复析构,程序崩溃

2、文件句柄,socket重复关闭

3、虚函数表指针丢失


什么时候生成默认拷贝函数

编译器编译的时候默认生成的,如果不生成会和C++11语法冲突

以下情况不得不生成:

        (1)类成员变量也是一个类

class A{
private:
        B b;//类B有默认拷贝构造函数
            //为了调B的默认拷贝构造函数,编译器不得不为A生成一个默认拷贝
};

        (2)类继承一个基类,该基类有默认拷贝构造函数,编译器也会给子类生成一个

        (3)类成员中虚函数

        (4)类继承自基类,基类中有虚函数


什么时候会触发拷贝构造函数

1、赋值

//通过b对象构造a对象,把b赋值a
A b;
A a(b);
//或者
A b;
A a = b;

2、函数参数 形参为类对象

3、函数返回值

默认情况下,会使用编译器优化,返回值优化,只会触发一次,直接赋给对象

void func(){
    A a;//1.构造a
    return a;//2.返回时用另一个对象接收,拷贝构造
}//3.析构a

A a = func();

C++11以后,如果禁掉优化,看类内是否有移动构造,a是将亡值,赋a时考虑有没有移动构造,把a的资源移给a;看类有没有拷贝构造

如果以上两种构造都没有,会报错

C++中,拷贝构造函数是一种特殊的构造函数,它由编译器在特定情况下自动调用,用于创建一个新的对象并将其初始化为已有对象的副本。拷贝构造函数的参数通常采用引用的方式传递,以避免无限递归的问题。 对于类C中的拷贝构造函数,可以通过以下方式进行定义: ```cpp class C { public: // 拷贝构造函数 C(const C& other) { // 在此处进行对象的成员变量的拷贝 // 可以使用已有对象的成员变量值来初始化新对象的成员变量 } }; ``` 拷贝构造函数的作用是创建一个新对象,并将已有对象的成员变量值复制给新对象的对应成员变量。需要注意的是,函数成员是共用的,只有一份拷贝,所以拷贝构造函数只需要复制数据成员即可。 拷贝构造函数可以用来进行对象的初始化,例如通过已有对象来初始化新对象的存储空间。这种情况下,编译器会自动调用拷贝构造函数来完成初始化过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++——拷贝构造函数](https://blog.youkuaiyun.com/weixin_59179454/article/details/124853916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值