C++ Primer 第五章笔记

本文探讨了C++中的语句控制结构,包括悬垂else的问题及解决办法,switch语句的执行流程与变量定义规则,以及range-for语句的使用。同时,介绍了异常处理机制,包括自定义异常类型的方法。

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

C++ Primer 第五章笔记 语句

  1. 悬垂else
    C++中规定else与离他最近的尚未匹配的if匹配
    为了避免歧义,可以用花括号控制执行路径
  2. switch语句
    如果某个case标签匹配成功,将从该标签处开始顺序执行所有case分支。如果有break语句跳出switch部分,有时故意省略break语句使得程序能够连续执行若干个case标签。
  • switch内部的变量定义
    在switch语句中不能跳过带初始值的变量
case true:
	string file_name;//错误,不允许跳过一个初始化的变量
	int ival=0;//错误,不允许跳过一个初始化的变量
	int jval;//正确,因为只是声明,没有初始化
	break;
case false:
	jval=next_num();//正确,给jval赋初始值
	if (file_name.empty())//file_name在作用域(switch)内,但是没有被初始化

可以在switch语句中定义一个变量的三种情况
a)可以在default中定义;b)可以在最后一个case中定义;c)在某个特殊的定义变量,引入块语句,块语句中是个单独的变量域。

  1. 范围for语句
vector<int> v = {0,1,2};
for (auto &r:v)
	r*=2;

for (auto beg = v.begin(),end=v.end();beg != end;++beg){
	auto &r = *beg;
	r *= 2;
}
  1. 标准异常
    自己定义异常类型
struct MyException : public exception
{
    const char* what () const throw ()//第二个const指这是个常函数,throw()说明可以不抛出异常,throw(type)会抛出type异常,throw(...)可能是任何类型的异常
    {
        return "C++ Exception";
    }
};

常函数含义是函数体的代码不能修改实参的值,但是可以修改形参的值。常函数可以被其他成员函数调用,但是不能调用其他非常函数。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
### 关于《C++ Primer》第五版学习笔记 #### 变量和基本类型 在讨论变量和基本类型的章节中,重点介绍了不同数值类型的选择依据以及它们的特点。对于无符号数而言,在某些特定场景下使用可以有效防止负值的出现,从而简化逻辑判断[^1]。 针对字符处理方面,不仅涵盖了ASCII码表中的常规字符表示方法,还深入探讨了转义序列的应用方式及其作用范围;同时讲解了如何通过前缀指定整型常量所属的不同进制形式(如0b代表二进制、0代表八进制而默认则是十进制),这有助于提高程序可读性和灵活性。 为了确保代码质量并减少潜在错误的发生几率,书中强调了良好的编程习惯——即合理地初始化每一个新创建出来的对象实例,并且遵循统一清晰易懂的名字约定规则来增强团队协作效率。 另外值得注意的是`typedef`关键字可用于定义现有数据类型的别名以便更好地表达语意或简化复杂模板参数书写过程;而在现代版本里新增加的支持语法糖特性则允许开发者利用更简洁直观的方式完成相同功能实现—这就是所谓的`using`声明句法。 ```cpp // 使用 typedef 定义类型别名 typedef unsigned long ulong; ulong value; // 使用 using 定义类型别名 (C++11) using uint = unsigned int; uint anotherValue; ``` #### 字符串、向量和数组 进入第三章之后,则转向更加实用的数据容器介绍部分。首先是关于字符串的操作指南,这里区分了两种不同的实现机制:一种是由标准库所提供专门用于管理动态长度文本片段的对象模型(`std::string`);另一种则是基于固定大小缓冲区的传统风格零结尾字节数组(C-style string),两者之间存在显著差异但也能够相互转换[^2]。 除了上述提到的内容之外,本节还将目光投向了更为通用化的集合类——STL容器之一vector。作为自动调整容量的一维线性表结构,它具备随机访问速度快的优势特点,因此非常适合用来存储大量同类元素并且支持高效增删改查操作。 最后不得不提的就是迭代器概念,这是一种抽象指针的概念,使得算法设计者可以在不了解具体内部细节的情况下遍历整个序列成员,极大地提高了代码复用率与维护便利程度。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> numbers{1, 2, 3}; // 迭代器遍历 vector 中的所有元素 for(auto it = numbers.begin(); it != numbers.end(); ++it){ std::cout << *it << " "; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值