C++11 =default, =delete

本文通过模板类Leaf实例,详细解析了C++中=default与=delete的使用方法,强调了如何通过=default来定义默认构造函数与析构函数,以及如何使用=delete来禁止拷贝和赋值操作,确保类的唯一性和不可逆操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ =default,=delete的使用

  • 使用示列模板类Leaf
	/**
	* @brief: C++11(6) C98(4) 编译器为类默认生成
	* 默认构造函数、默认析构函数
	* 默认拷贝构造函数、默认赋值函数
	* 移动构造函数(C11)、移动拷贝函数(C11)
	* = default 只能针对特殊的
	* == delete  可成员
	*/
	template<typename T>
	class Leaf
	{
	public:
	    Leaf() = default; //= default可有可无
	    ~Leaf() = default;
	
	    //戈特弗里德·威廉·莱布尼茨(Gottfried Wilhelm Leibniz)说过
	    //“世上没有两片完全相同的树叶”,
	    //所以不能拷贝和赋值
	    Leaf(Leaf &) = delete;
	    Leaf& operator=(Leaf &) = delete;
	
	public:
	   void setWeight(T weiValue); // 设置树叶重量,这里主要是想用模板
	    T getWeight();
	
	public:
	    void growUp();              // 可以长大
	    void growDown() = delete;   // 但不可以长小吧
	
	private:
	    T m_weight; //重量
	    T m_age;
	};
	
	//vector<Leaf<float>> leafs;
### 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、付费专栏及课程。

余额充值