首页 > 代码库 > c++ primer 5th 笔记:第五章

c++ primer 5th 笔记:第五章

第五章:语句

  笔记

    1. 复合语句是指用花括号括起来语句和声明的序列,复合语句也被称作块(block)一个块就是一个作用域

    2. 定义在控制结构(if、switch、while、for)中的变量只在相应的语句内部可见,一旦语句结束,变量也就超出其作用范围了。

    3. 对于悬垂else问题,c++规定,else与离它最近的尚未匹配的if匹配,从而消除了程序的二义性。

    4. switch语句中,case标签必须是整型常量表达式,且任何两个case标签的值不能相同

    5. c++语言规定,不允许跨过变量的初始化语句直接跳转到该变量作用域的另一个位置(p163)。如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外。

    6. 牢记for语句中定义的对象只在for循环体内可见

    7. break语句负责终止离它最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。

    8. continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while和do while循环的内部。(注意:无switch)

 

重点知识点总结:

    一. 范围for语句:

    c++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。形式:

    for (declaration : expression)
        statement

    expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组、vector或者string等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin()和end()成员。 declaration定义一个变量,序列中的每一个元素都得能转换成该变量的类型,确保类型相容最简单的方法是使用auto类型说明符。如果需要对序列中元素执行写操作,循环变量必须声明为引用类型

    每次迭代都会定义循环控制变量,并将其初始化成序列中的下一个值,之后才执行statement。

    vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    // 范围变量必须是引用类型,这样才能对元素执行写操作
    for (auto &r :v)
        r *= 2;            // 将v中每个元素的值翻倍

    二. try语句块和异常处理

    异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。

    当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号以表明程序遇到了故障,无法继续下去了,而且信号的发出方无须知道故障将在何处得到解决。

 1 #include <stdexcept>
 2 #include "Sales_item.h"
 3 #include <iostream>
 4 using std::cin;
 5 using std::endl;
 6 using std::cout;
 7 using std::runtime_error;    // runtime_error是一个异常类
 8 
 9 int main()
10 {
11     Sales_item item1, item2;
12     while(cin >> item1 >> item2)
13     {
14         try                  // try 语句块中代码抛出的异常通常会被某个catch子句处理
15         {
16             if (item1.isbn() == item2.isbn())
17             {
18                 cout << item1 + item2 << endl;
19             }
20             else
21             {
22                 throw runtime_error("Date must refer to same ISBN"); 
23                                 // throw引发(raise)了异常
24             }
25         }
26         catch(runtime_error err)     // runtime_error类传递异常的具体信息
27         {
28             cout << err.what()
29                 << "\n Try Again? Enter y or n" << endl;
30             char c;
31             cin >> c;
32             if (!cin || c == n)
33                 break;
34         }
35     }
36     return 0;
37 }            

      c++标准库定义了一组类,用于报告标准库函数遇到的问题,分别定义在四个头文件中:

          exception、stdexcept、new、type_info

  术语

    表达式语句(expression statement)、复合语句(compound statement)、悬垂else(dangling else)、

    范围for语句(rang for statement)、throw表达式(throw expression)、try语句块(try block)、异常类(exception class)。

c++ primer 5th 笔记:第五章