文章目录
- 概述
- default
- delete
- 小结
概述
在看一些开源项目的源码的时候,经常会看到default和delete。这2个关键字究竟什么意思呢?这篇文章就来一点一点拆解下。
default
默认构造函数、拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符和析构函数的显式默认化;
C++11允许开发者使用 default 关键字来显式要求编译器生成默认的特殊成员函数。这通常用于当类需要自定义一些特殊成员函数,但又想保留其他成员函数的默认行为时。看如下代码:
class MyClass {
public:MyClass() = default; // 显式使用编译器生成的默认构造函数MyClass(const MyClass&) = default; // 显式使用编译器生成的拷贝构造函数~MyClass() = default; // 显式使用编译器生成的默认析构函数// 其他成员函数...
};
delete
在C++中,delete 关键字用于删除函数、构造函数或默认的特殊成员函数(默认构造函数、拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符和析构函数)。使用 delete 可以防止编译器自动生成这些函数,或者覆盖默认实现。
1.删除默认构造函数:
如果一个类不需要默认构造函数,可以使用 delete 来删除它。
class NoDefault {
public:NoDefault(int x) : x(x) {} // 只提供一个带参数的构造函数
private:int x;
public:NoDefault() = delete; // 禁止使用默认构造函数
};
2.删除拷贝构造函数和拷贝赋值运算符:
对于需要管理资源的类,可能不希望对象被拷贝,这时可以使用 delete 来删除拷贝构造函数和拷贝赋值运算符。
如下代码:
class NoCopy {
public:NoCopy(const NoCopy&) = delete;NoCopy& operator=(const NoCopy&) = delete;
};
3.删除移动构造函数和移动赋值运算符:
如果类不需要移动语义,可以删除移动构造函数和移动赋值运算符。
如下代码:
class NoMove {
public:NoMove(NoMove&&) = delete;NoMove& operator=(NoMove&&) = delete;
};
4.删除析构函数:
通常析构函数不会被删除,因为它用于释放资源。但是,如果类中没有需要手动释放的资源,可以删除析构函数,让编译器生成默认的析构函数。
如下代码:
class NoDestructor {
public:~NoDestructor() = delete; // 通常不推荐这样做
};
5.删除所有默认的特殊成员函数:
C++11引入了一种语法,可以一次性删除所有默认的特殊成员函数。
如下代码:
class AllDeleted {
public:AllDeleted() = delete;AllDeleted(const AllDeleted&) = delete;AllDeleted(AllDeleted&&) = delete;~AllDeleted() = delete;AllDeleted& operator=(const AllDeleted&) = delete;AllDeleted& operator=(AllDeleted&&) = delete;
};
小结
好了,看完这些,是不是有点了解了。以后看起来一些源代码会轻松很多。感兴趣吗,一起学习。顺便说一句,使用 delete 关键字可以提供对类行为更细致的控制,特别是在资源管理和对象生命周期管理方面。然而,过度使用 delete 可能会导致类的使用变得复杂和受限。OK,翻篇!