1.throw表达式:throw语句应用了一个表达式,runtime_error类型是标准库异常类的一种,在stdexcept头文件中定义。
2.try块:每个catch字句包括三部分,关键字catch,圆括号内单个类型或者单个对象的说明以及通常用花括号括起来的语句块。try块也引入局部作用域。
3.寻找处理代码的过程与函数调用链相反。如果不存在处理该异常的catch字句,程序的运行就要跳转到名为terminate的标准库函数。
4.使用预处理器进行调试,assert和异常处理的区别,摘自博客
“Assert用于检查不应该发生情况,用来帮助开发人员对问题的快速定位。异常处理用于对程序发生异常情况的处理,增强程序的健壮性、容错性,减少程序使用中对用户不有好的行为,不让(通常也不必)用户知道发生了什么错误。实际开发中,我们通常将Assert与异常混淆, 不知道什么时候使用Assert,什么时候使用异常处理。或者不用Assert,将一切情况都归为异常。这样一来,就掩盖了问题,当问题发生的时候,很难进行定位,而这些问题本该是在开发的时候就解决掉的。同时,也增加了开销(在c#中,debug.Assert()编译成release版本时,不会产生任何代码,而try/catch在debug/release版本中都是有代码产生,运行时需要开销)。”
“我们需要在调用的时候,确保参数container不为null。如果发布成公共类库,那么应该做异常处理,确保第三方错误调用的时候,知道问题在哪。
关于异常处理, 在编写代码的时候,应充分考虑各种具体异常,而不简单的catch到Exception,写出更健壮的代码。
通常来说,能够用Assert的地方,都可以用try/catch处理 。但这不是好习惯。或许你可能认为,程序release后,try/catch也就比Assert多出那么点开销,对现代的机器而言微不足道,那的确很对。为什么不认真对待自己写出来的代码呢?”
5.预处理器定义了其余四种在调试时用的变量。
6.使用NDEBUG预处理变量和assert预处理宏进行调试,但是只能对程序的调试有帮助,不能用来代替运行时的逻辑检查,也不能代替对程序程序可能产生的错误的检查。
7.标准库定义了两个预处理变量代表程序运行成功和失败。
8.函数的返回值用于初始化在调用函数处创建的临时变量。
9.当函数返回引用类型时,没有复制返回值,返回对象本身。形参和返回类型都是指向const对象的引用,调用函数返回结果时,都没有复制这些对象。
10.千万不要返回局部对象的引用,与不要返回指向局部对象的指针是类似的。
11.为了确保对于指定的函数其所有声明保持一致,如果函数接口发上变化,只需要修改唯一的声明就可以了。
12.静态局部对象。
13.内联函数应该在头文件中定义,因为它要对编译器可见。仅有原型是不行的。当然,编译器也可以选择忽略内联函数的说明。
14.编译器隐式的将在类内定义的成员函数当作内联函数。成员函数形参表后面的const所起的作用就是改变了隐含的this形参的类型。
15.内置类型成员的初值依赖于对象如何定义。
16.重载。如果形参表相同但是返回值不同,则为错误。返回值不同的话,不能从上下文中了解到该调用哪一个函数。重载的时候对函数的匹配过程中,const对非引用对象是没有修饰作用的。比如,int look(int )和int look(const int)这个两个函数不算重载:复制实参的时候不考虑形参是否为const, 因为操纵的只是副本而已。有const引用形参的函数和非const引用形参的函数是不同的。
17.含有多个形参的重载确定。仅当形参是引用或者指针的时候,是否为const才有影响。
18.允许使用函数指针指向重载的函数,指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值会编译错误。
2.try块:每个catch字句包括三部分,关键字catch,圆括号内单个类型或者单个对象的说明以及通常用花括号括起来的语句块。try块也引入局部作用域。
3.寻找处理代码的过程与函数调用链相反。如果不存在处理该异常的catch字句,程序的运行就要跳转到名为terminate的标准库函数。
4.使用预处理器进行调试,assert和异常处理的区别,摘自博客
“Assert用于检查不应该发生情况,用来帮助开发人员对问题的快速定位。异常处理用于对程序发生异常情况的处理,增强程序的健壮性、容错性,减少程序使用中对用户不有好的行为,不让(通常也不必)用户知道发生了什么错误。实际开发中,我们通常将Assert与异常混淆, 不知道什么时候使用Assert,什么时候使用异常处理。或者不用Assert,将一切情况都归为异常。这样一来,就掩盖了问题,当问题发生的时候,很难进行定位,而这些问题本该是在开发的时候就解决掉的。同时,也增加了开销(在c#中,debug.Assert()编译成release版本时,不会产生任何代码,而try/catch在debug/release版本中都是有代码产生,运行时需要开销)。”
“我们需要在调用的时候,确保参数container不为null。如果发布成公共类库,那么应该做异常处理,确保第三方错误调用的时候,知道问题在哪。
关于异常处理, 在编写代码的时候,应充分考虑各种具体异常,而不简单的catch到Exception,写出更健壮的代码。
通常来说,能够用Assert的地方,都可以用try/catch处理 。但这不是好习惯。或许你可能认为,程序release后,try/catch也就比Assert多出那么点开销,对现代的机器而言微不足道,那的确很对。为什么不认真对待自己写出来的代码呢?”
5.预处理器定义了其余四种在调试时用的变量。
6.使用NDEBUG预处理变量和assert预处理宏进行调试,但是只能对程序的调试有帮助,不能用来代替运行时的逻辑检查,也不能代替对程序程序可能产生的错误的检查。
7.标准库定义了两个预处理变量代表程序运行成功和失败。
8.函数的返回值用于初始化在调用函数处创建的临时变量。
9.当函数返回引用类型时,没有复制返回值,返回对象本身。形参和返回类型都是指向const对象的引用,调用函数返回结果时,都没有复制这些对象。
10.千万不要返回局部对象的引用,与不要返回指向局部对象的指针是类似的。
11.为了确保对于指定的函数其所有声明保持一致,如果函数接口发上变化,只需要修改唯一的声明就可以了。
12.静态局部对象。
13.内联函数应该在头文件中定义,因为它要对编译器可见。仅有原型是不行的。当然,编译器也可以选择忽略内联函数的说明。
14.编译器隐式的将在类内定义的成员函数当作内联函数。成员函数形参表后面的const所起的作用就是改变了隐含的this形参的类型。
15.内置类型成员的初值依赖于对象如何定义。
16.重载。如果形参表相同但是返回值不同,则为错误。返回值不同的话,不能从上下文中了解到该调用哪一个函数。重载的时候对函数的匹配过程中,const对非引用对象是没有修饰作用的。比如,int look(int )和int look(const int)这个两个函数不算重载:复制实参的时候不考虑形参是否为const, 因为操纵的只是副本而已。有const引用形参的函数和非const引用形参的函数是不同的。
17.含有多个形参的重载确定。仅当形参是引用或者指针的时候,是否为const才有影响。
18.允许使用函数指针指向重载的函数,指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值会编译错误。
5931

被折叠的 条评论
为什么被折叠?



