C语言关键字浅析-default

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

default关键字用在switch分支语句中

一般与case搭配使用,含义是缺省的其他条件

 

default的作用是:

标记switch语句中的缺省情况下的程序开始位置。

 

这是switch语句常见的结构:

switch(c)
{
	case 1:
		c++;       /* 数值为1时,增加1 */
        break;
	case 2:
		c += 2;    /* 数值为2时,增加2 */
        break;
	default:
		c--;       /* 否则自减 */
}

显然,这个语句的执行过程应该是,对参数c与每个case后的值进行逐一比较,如果没有匹配值,则跳到default

当然如果该switch中没有default,而且也没有与case匹配成功,那程序将往下继续执行

不过此处应该再考虑这么一个问题,default与break的配合,以及如果default没有处于末尾

即这种情况:

switch(c)
{
	default:
		c--;     /* default前置了 */
	case 1:
		c++;     /* case顺序不变 */
		break;
	case 2:
		c += 2;
		break;
}

这样写有个潜在的bug,就是default后并没有break,可能是default常年写在末尾的后遗症

其bug在于,如果参数非1和2,参数本应减一但由于程序从default开始,后面还有case且default的处理后没有break

那么程序将继续往下执行直到结束或break,本例中将会减一后加一

 

——参考《C Primer Plus第五版》

 

相关文章:

C语言关键字浅析-switch

C语言关键字浅析-case

### C++ 中 `default` 关键字的功能与使用场景 #### 1. 基本功能 `default` 关键字用于显式请求编译器为类生成特定的默认成员函数。这些函数通常包括默认构造函数、复制构造函数、移动构造函数、赋值运算符以及析构函数等[^2]。 通过使用 `default`,程序员能够更清晰地表达意图,同时增强代码的可读性和可维护性。它允许开发人员控制哪些特殊成员函数由编译器自动生成,并确保它们的行为符合预期。 --- #### 2. 使用场景 ##### (1) 显式定义默认构造函数 即使类没有任何数据成员或基类,也可以通过 `= default` 来显式声明默认构造函数。这种做法提高了代码的透明度,使其他开发者更容易理解该类的设计意图。 ```cpp class MyClass { public: MyClass() = default; // 请求编译器生成默认构造函数 }; ``` ##### (2) 定义复制/移动操作 对于需要支持深拷贝或其他复杂逻辑的类,可以通过 `= default` 让编译器生成浅拷贝版本的复制构造函数和赋值运算符。这种方式适用于简单类型的对象管理。 ```cpp class ResourceHolder { public: ResourceHolder(const ResourceHolder& other) = default; // 复制构造函数 ResourceHolder(ResourceHolder&& other) = default; // 移动构造函数 ResourceHolder& operator=(const ResourceHolder& other) = default; // 赋值运算符 }; ``` ##### (3) 配合 `deleted` 禁用不必要函数 当希望禁用某些操作时,可以结合 `delete` 和 `default` 进行精细化设计。例如,在不可拷贝的对象中仅保留移动语义。 ```cpp class NonCopyableButMovable { public: NonCopyableButMovable(const NonCopyableButMovable&) = delete; NonCopyableButMovable& operator=(const NonCopyableButMovable&) = delete; NonCopyableButMovable(NonCopyableButMovable&&) = default; NonCopyableButMovable& operator=(NonCopyableButMovable&&) = default; }; ``` ##### (4) 继承中的应用 在派生类中重新定义并标记为 `default` 的情况下,可以覆盖基类的相关行为,从而实现一致性的继承结构。 ```cpp class Base { public: virtual ~Base() = default; }; class Derived : public Base { public: ~Derived() override = default; // 派生类中重新定义析构函数 }; ``` --- #### 3. 示例代码 下面是一个综合示例,展示如何利用 `default` 减少冗余代码: ```cpp #include <iostream> #include <string> class Person { private: std::string name; int age; public: // 默认构造函数 Person() = default; // 参数化构造函数 explicit Person(std::string n, int a) : name(std::move(n)), age(a) {} // 复制构造函数 Person(const Person& other) = default; // 移动构造函数 Person(Person&& other) noexcept = default; // 赋值运算符 Person& operator=(const Person& other) = default; // 析构函数 ~Person() = default; void display() const { std::cout << "Name: " << name << ", Age: " << age << '\n'; } }; int main() { Person p1("Alice", 30); p1.display(); Person p2(p1); // 调用复制构造函数 p2.display(); Person p3(std::move(p1)); // 调用移动构造函数 p3.display(); } ``` 上述代码展示了如何通过 `default` 自动生成必要的特殊成员函数,简化了类的实现过程。 --- #### 4. 总结 `default` 是一种强大的工具,能够在现代 C++ 开发中显著提升效率和代码质量。它的主要作用在于明确指示编译器生成所需的默认函数,避免手动编写重复代码的同时增强了程序的健壮性[^4]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值