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;看类有没有拷贝构造

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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值