C++ 学习笔记之(5)-语句和异常
C++ 提供了一组控制流语句以支持更复杂的执行路径
条件语句
C++语言提供了两种条件语句,if
语句和switch
语句
- 悬垂else:else与离它最近的尚未匹配的if匹配
- case 标签必须是整型常量表达式
- switch内部的变量定义:如果要在某个case分支定义并初始化一个变量,应该把变量定义在块内,确保后面的所有case标签都在变量的作用域之外。
迭代语句
C++11新标准引入了范围for
语句,可以遍历容器或其他序列的所有元素,其语法形式为
for(declaration: expression)
statement
expression
表示的是一个序列,即拥有能返回迭代器的begin
和end
成员
- 花括号括起来的初始值列表
- 数组
vector
或string
等类型
for(int a : {1, 2, 3}) // 初始化列表
cout << a << endl;
try语句块和异常处理
异常处理机制为程序中异常检测和异常处理提供支持,C++中异常处理包括
throw表达式(throw expression)
:异常检测部分使用throw
表达式来引发异常try语句块(try block)
:异常处理部分使用try
语句块处理异常,try
抛出异常,catch
捕获异常一套异常类
:用于在throw
表达式和相关的catch
字句之间传递异常的具体信息
throw 表达式
抛出异常
throw runtime_error("This is the first runtime_error");
try 语句块
try{
// 处理代码,失败就会抛出 runtime_error 异常
throw runtime_error("This is the second runtime_error");
}catch(runtime_error err){
cout << err.what(); // 捕获异常,输出异常信息 "This is the second runtime_error"
}
try
语句块抛出异常后,程序沿着程序的执行路径逐层回退寻找适当类型的catch
子句处理异常,若最终还是没能找到,则转到名为terminate
的标准库函数,非正常退出。
标准异常
C++标准库定义的异常类如下
exception
头文件:定义了最通用的异常类exception
, 只报告异常的发生,不提供任何额外信息stdexcept
头文件:定义了几种常用的异常类new
头文件:定义了bad_alloc
异常类型type_info
头文件:定义了bad_cast
异常类型
exception
、bad_alloc
和bad_cast
对象只能执行默认初始化,不能为其提供初始值- 除了以上,其他异常类型不允许默认初始化,应该使用
string
对象或者C风格字符串初始化异常对象 - 异常类型只定义了
what
成员函数,没有参数,返回值为const char *
, 若异常类型有字符串初始值,则返回该字符串,若无初始值,则返回内容由编译器决定