C++11 =default,=delete

C++11 =default,=delete

1. 简介

=default 和 =delete 大部分情况下是用在构造函数(ctor)、析构函数、拷贝构造和拷贝赋值函数(这四种函数被称为 Big-Three)中。

如果自己已经有定义了一个 ctor ,那么编译器就不会在给你一个 default ctor。如果你强制加上 =default,就可以重新获得并使用 default ctor。default ctor 就是编译器给的默认的构造函数。如果你没有显式写出构造函数,我们常说有默认的构造函数,其实指的就是这一个。

单纯的 default ctor 没什么用,只是一个空函数,因为编译器不知道你要做什么。但如果有继承关系的话,这个 default ctor 就很有用。因为如果这个类是有继承其他父类的话,且 ctor 是 default ctor 的话,当调用到该类时,如果使用的是 default ctor ,这个 default ctor 里面会帮你调用父类的 ctor。也就是编译器背后会给你加上代码。

·· 在这里插入图片描述

Big-Three 加上右值引用的构造函数和它的拷贝赋值就是 Big-Five。

2. 示例

如果有一个类 Foo,类中有一个成员变量 _i。

Foo(int i)
### C++ 中 `= delete` 的用法及常见场景 #### 一、`= delete` 基本概念 在 C++11 及之后的标准中,`= delete` 是一种显式禁用特定函数的方式。通过这种方式,程序员能够阻止某些操作被调用或隐式生成[^1]。 当某个函数被声明为 `= delete` 后,任何尝试调用该函数的行为都会导致编译期错误。这种机制主要用于防止不希望的操作发生,或者强制用户以某种特定方式使用类的功能[^2]。 --- #### 二、`= delete` 的典型应用场景 ##### 1. **禁用拷贝构造函数和赋值运算符** 对于不可复制的对象(如单例模式中的对象),可以通过将拷贝构造函数和赋值运算符标记为 `= delete` 来禁止这些行为: ```cpp class NonCopyable { public: NonCopyable() = default; NonCopyable(const NonCopyable&) = delete; // 禁用拷贝构造函数 NonCopyable& operator=(const NonCopyable&) = delete; // 禁用赋值运算符 }; ``` 这样做的目的是确保对象不会意外地被复制或赋值[^3]。 ##### 2. **避免虚函数的删除** 需要注意的是,`= delete` 不适用于虚函数。如果试图对虚函数应用 `= delete`,则会导致编译失败。 ##### 3. **限制模板特化** 在模板编程中,有时需要排除某些类型的实例化。此时可以利用 `= delete` 达到这一目的: ```cpp template<typename T> void process(T t) {} // 显式禁用 int 类型的实例化 template<> void process<int>(int t) = delete; int main() { process(42); // 编译错误:process(int) 被删除 process(3.14f); // 正常工作 } ``` 上述代码展示了如何针对特定类型禁用模板函数。 ##### 4. **避免参数形式转换** 即使一个函数未定义具体实现并标注为 `= delete`,它仍然可以在重载解析阶段参与匹配过程。这使得我们可以利用其来捕获潜在的形式转换问题: ```cpp class MyClass { public: void func(double d); void func(float f) = delete; // 删除 float 版本 }; MyClass obj; obj.func(0.5); // OK, 使用 double 参数版本 obj.func(0.5f); // 错误:float 参数版本已被删除 ``` 在这里,`func(float)` 被明确移除,从而避免了可能由浮点数精度损失引发的问题。 --- #### 三、总结 `= delete` 提供了一种简洁而高效的方法来约束类接口的设计,增强了程序的安全性和可维护性。合理运用它可以有效减少不必要的副作用以及难以追踪的运行时错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值