在讲解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中专门用来做禁止拷贝/复制构造函数操作的.
太深的运用其实也没有.