C++11 delete关键字 禁止默认拷贝构造函数和复制操作

在讲解delete关键字之前,我们先说说最早之前我们是如何禁止拷贝构造函数的!

把delete关键字引入的前因后果都深入的理解一下 !

class A {
    
public:
    A(){}
  
private:
    
    //拷贝构造函数
    A(const A& other) {
        cout << "copy construcor" << endl;
    }
    
    void operator=(const A& other) {
        cout << "copy function" << endl;
    }
    
};

class B : A{
public:
    B(){}
};

(当我们自己实现了拷贝构造函数的时候,叫深层拷贝,这个时候编译器就不会自动帮我们生成默认的构造函数了,所以我们需要自己手动添加一下)

B继承于A,接下来我们开始测试:

在这里插入图片描述

各位老铁,编译阶段就直接挂掉了,这是为何?

在这里有一个提问:

如果我们在B类里面也做了和A一样的操作,重载=运算符,写B自己的拷贝构造函数,在运行程序,程序编译阶段还能通过运行吗?

答案是可以的。

为什么呢?

所以肯定是编译器的默认的拷贝构造函数和重载=操作导致的.

编译器默认的拷贝构造函数会自动帮我们调用父类的拷贝构造函数,但是现在的情况是,父类A的拷贝构造函数是私有的,子类很明显是无法调用父类的私有方法的,所以编译肯定无法通过.

这个就是禁止默认拷贝和复制的原理.

在C++ 11中我们引入了delete关键字来帮我们完成这个操作,接下来我们重点理解下delete关键字.

细节大家参考:
https://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html

接下来我个人进行补充说明:

delete / default 关键字的引入都是有原因的.

上面我们说过,如果我们自己实现了构造函数(包括拷贝构造函数和其它类型的),那么编译器就不会自动帮我们生成默认的构造函数-()了.

class A {
public:
    A(const A& other){}
};

这个时候,默认的构造函数A(){},编译器就不会帮我们自动生成了.

在这里插入图片描述

所以这么写就会有问题.

但是编译器自动生成的代码会比我们自己写的代码效率高很多,所以引入了default关键字,告诉编译器,你还是默认帮我生成一个吧.

改良后:

class A {
public:
    A()  = default;//编译器会默认帮我们实现,所以我们不需要自己单独实现了!
    A(const A& other){}
};

注意: 编译器只会帮助生成它自己有的:默认构造函数/拷贝构造函数/默认析构函数/复制运算符操作,并不会无中生成

接下来说delete关键字.

delete关键字在 c++ 11中代表此函数禁止使用,比我们最开始的通过 private实现禁止拷贝和构造更严格.

class A {
public:
    A()  = default;
    A(const A& other){}
    
    void showmsg() = delete;
};

在这里插入图片描述

被delete标记的函数,是绝对禁止被使用的.

我个人的理解是,这更关键字就是为c++ 11中专门用来做禁止拷贝/复制构造函数操作的.

太深的运用其实也没有.

猜你喜欢

转载自blog.csdn.net/zhangkai19890929/article/details/84934538
今日推荐