原创 【博客大赛】《C++ Primer》学习笔记(十四)Statements

2016-3-18 14:15 1199 10 10 分类: MCU/ 嵌入式 文集: Qt和Cpp
单一的分号,表示空指令。请为空指令增加注释,以免别人产生误解。
空括号和空指令的含义是一样的:
 • {}
 • ;

switch的习惯用法是要加上break。如果确实需要忽略break,就注释一下吧。
总是要为switch增加default,这样告诉别人default的情况是存在的。

switch (flag) {
case true:
    string file_name;  //错误,隐式初始化的变量将被跳过
    int ival = 0;      //错误,显式初始化的变量将被跳过
    int ival;          //正确,未初始化的变量可以存在
    break;
case false:
    jval = next_num();
    if (file_name.empty())  //错误,因为它并没有被初始化
    break;
}

虽然这里有非法的变量,也有合法的变量,所以除非不可避免,否则还是在自己的分支里面定义自己的变量。
注意,程序无法跳过在scope里面的变量初始化操作。

for循环的执行顺序:
 • 当for循环开始的时候,第一个初始化语句被执行。
 • 然后,第二个条件判断开始evaluated。
 • 如果为真则执行之后的内容;如果为假则终结循环。
 • 如果为真,执行之后的内容之后再执行第三个表达式的内容。
 • 重复第二个步骤。

要注意for的初始化语句,只能有一种数据类型。
range for我们已经用过很多次了,它的使用比传统的for更加方便。
不要在range for里面为string、array或者容器添加元素,因为end()是被缓存的,不会随着更改。

----------------
以上内容有点无聊,因为C语言里面已经学过了,因此有一种把课本再看一遍的感觉。
但是接下来的内容就不会了,终于有了打起精神的赶脚^_^

try Blocks and Exception Handling
运行中的异常,比如失去了数据库的连接,或者获得了一个unexpected输入,称为exceptions。
处理异常情况,应该是系统设计里面最困难的部分。

Exception handling是指程序的某部分检查到它无法解决的问题,并且用于检查的程序也无法继续。
检查程序需要一种方法,给出错误信号,告诉别人他无法继续了。
另外,检查程序给出的出错信号,并不能知道究竟会是哪个程序来处理它。
还有,检查程序给出信号之后,就停止运行了。

通常情况下,给出exception信号的代码,和处理它的代码,是两个不同的部分。
所以exception handling一般包含两个部分:
throw expressions // 产生错误通知的信号
try blocks        // 对信号进行处理

假如我们现在需要实现一种功能,连接两个不同的字符串,代码如下:
int main()
{
    string str1, str2;

    cin >> str1 >> str2;
    if (str1 == str2)
        throw runtime_error("Strings are equal.");
    cout << "String: " << str1 + str2 << endl;
    return 0;
}

执行的时候,如果我们输入相同的字符串,比如“there”,则会如下执行:
$ ./hello
there
there
terminate called after throwing an instance of 'std::runtime_error'
  what():  Strings are equal.
Aborted

执行的时候,如果我们输入不同的字符串,比如“there”、“here”,则会如下执行:
$ ./hello
there
here
String: therehere

throw的用法是不是很简单呢?
现在我们需要更加复杂一些的处理,而不是使用编译器为我们定义的默认选项,此处就可以使用try了:
int main()
{
    string str1, str2;

    cin >> str1 >> str2;
    try {
        if (str1 == str2)
            throw runtime_error("Strings are equal.");
        cout << "String: " << str1 + str2 << endl;

    } catch (runtime_error err) {
        cout << "Error: " << err.what() << endl;
    }

    return 0;
}

执行的时候,如果我们输入相同的字符串,则它的执行效果和仅仅使用throw是一样的。
执行的时候,如果我们输入不同的字符串,则它的执行效果是:
$ ./hello
there
there
Error: Strings are equal.

try/catch可以嵌套使用,一个组合里面可以包含另一个组合,就像if/else一样。
搜索handler的顺序是call chain的反向:
 • 当有异常被抛出,抛出异常的函数会首先被搜索handler。
 • 如果没有匹配的handler,这个函数就会被终止。
 • 此函数的上一层函数会被搜索,如果没有匹配的handler,则这个函数也会被终止。
 • 依此类推。
 • 如果所有的函数都搜索不到匹配的handler,则会调用库函数terminate。

要编写安全的异常处理程序,非常的困难,尤其是handler里面对资源的安全回收。
这里就请参考《Unix环境高级编程》了,因为它不仅仅是语言的问题,也是系统的问题。

异常处理的类,包含在四个库文件中:
exception: the most general kind of exception class
stdexcept: several general-purpose exception classes
new:       bad_alloc, cover later
type_info: bad_cast, cover later

异常类的操作非常少,仅仅有创建、复制和赋值。
异常处理是C++语言里面的一个难点,需要在实际的使用中再多次练习。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条