C++11中=default用于显式要求编译器生成特殊成员函数,=delete用于禁用特定函数;常用场景包括显式生成默认构造函数或控制函数访问权限。

C++11引入了=default和=delete关键字,用来显式控制类的特殊成员函数(如构造函数、析构函数、赋值操作符等)的生成。这两个特性让程序员能更精确地管理对象的创建和复制行为。
使用=default定义默认函数
当编译器没有自动生成某个特殊成员函数时,或者你想在public或private中显式要求生成,可以使用
=default。
- 常用场景:允许编译器生成默认构造函数,即使你已经定义了其他构造函数
=default
可以写在类内(声明时)或类外(定义时)-
// 示例:强制生成默认构造函数
class MyClass { public: MyClass() = default; // 默认构造函数 MyClass(int x) : value(x) {} // 自定义构造函数 MyClass(const MyClass&) = default; // 允许拷贝构造 MyClass& operator=(const MyClass&) = default; // 允许拷贝赋值 ~MyClass() = default; // 默认析构 private: int value = 0; };使用=delete禁止函数调用
=delete
用于显式删除某个函数,任何尝试调用该函数的代码都会在编译时报错。常用于禁用不需要的构造方式或赋值操作。- 可用于任何成员函数,但最常见于拷贝控制成员
=delete
必须在类内声明- 比将函数设为private且不实现更安全(编译期报错而非链接错误)
class NonCopyable { public: NonCopyable() = default; // 删除拷贝构造和拷贝赋值 NonCopyable(const NonCopyable&) = delete; NonCopyable& operator=(const NonCopyable&) = delete; // 可以仍允许移动 NonCopyable(NonCopyable&&) = default; NonCopyable& operator=(NonCopyable&&) = default; };实际应用场景
结合=default和=delete,可以精准设计类的行为。
立即学习“C++免费学习笔记(深入)”;
- 设计单例或资源管理类时,禁止拷贝
- 希望类可移动但不可拷贝(类似std::unique_ptr)
- 限制某些参数类型的隐式转换
class Number { public: Number(int x) : val(x) {} // 禁止double转Number的隐式构造 Number(double) = delete; private: int val; }; Number a(5); // OK // Number b(3.14); // 编译错误:使用了deleted函数基本上就这些。合理使用=default和=delete,能让类的接口更清晰、更安全。特别是编写库代码时,明确告知用户哪些操作被支持或禁止,有助于减少误用。









