default 在 C++ 中有两类完全无关的用法:一是 switch 语句中的兜底分支,用于处理无匹配 case 的情况;二是 C++11 引入的 =default 修饰符,用于显式请求编译器生成特殊成员函数的默认实现。

default 在 C++ 中不是“分支”关键字,它和 switch 里的 default 标签完全无关。你看到的可能是混淆了两个同名但语义截然不同的东西。
switch 里的 default 是兜底分支
这是真正意义上的“分支”,用于处理 switch 表达式值不匹配任何 case 的情况:
- 不写
default不报错,但遗漏未覆盖值时行为不可控(比如读到非法枚举值,直接跳过) -
default可以放在任意位置,但习惯上放最后;它不依赖break是否存在,只控制是否执行该块 - 如果所有
case都有break,default就是纯粹的 fallback;如果漏了break,可能意外穿透到下一个case
C++11 的 =default 是函数声明修饰符
它和流程控制毫无关系,作用是显式要求编译器生成默认实现,仅适用于特殊成员函数:
- 只能用于:默认构造函数、析构函数、拷贝/移动构造函数、拷贝/移动赋值运算符
- 必须写在函数声明处(类内或类外定义),且不能和用户自定义实现共存——否则编译失败
- 类内写
=default会让函数隐式成为inline;如需非 inline,得在类外定义时加=default - 典型用途:当类已定义了带参构造函数,编译器不再自动生成默认构造函数,此时加
MyClass() = default;就能恢复它
为什么容易搞混?
名字一样,但一个在 switch 语句里(运行期逻辑分支),另一个在类定义里(编译期函数生成策略)。C++ 标准文档里把后者叫“defaulted function”,从不称其为“default 分支”。
立即学习“C++免费学习笔记(深入)”;
真正在写分支逻辑时,default 只出现在 switch;而涉及类设计时,=default 是控制默认函数生成的开关——这两个场景几乎不会交叉出现,但初学者扫到名字就容易误连。


















