C++ Primer 笔记4

来源:互联网 发布:python 重定向 编辑:程序博客网 时间:2024/06/05 09:16
1、一般而言,标准库提供的bitset操作更直接、更容易阅读和书写、正确使用的可能性更高。而且,bitset对象的大小不受unsigned数的位数限制。通常来说,bitset优于整型数据的低级直接位操作。
2、建议:只有在必要时才使用后置操作符。前置操作需要做得工作更少,只需加1后返回加1后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。
3、while(iter != ivec.end())
     cout<<*iter++<<endl;
 由于后自增操作的优先级高于解引用操作,因此*iter++等效于*(iter++)。
4、sizeof操作符  sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位是字节。sizeof表达式的结果是编译时常量,该操作符有以下三种语法形式:
   sizeof(typename)、sizeof(expr)、sizeof expr
   数组元素的个数: int sz = sizeof(ia) /sizeof(*ia);
5、逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算,逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值。
6、int *pi = new int;   // pipoints to an uninitialized int
   int *pi = new int(); // pipoints to an int value-initialized to 0
   如果指针的值为0,则在其上做delete操作是合法的,但这样做没有任何意义:
   int *ip = 0;
   delete ip; //C++保证:删除0值的指针是安全的。
7、显式转换也称为强制类型转换(cast),包括以下列名字命名的强制类型转换操作符:
  static_cast、dynamic_cast、const_cast和reinterpret_cast
  ①static_cast 编译器隐式执行的任何类型转换都可以由static_cast显式完成。
  ②dynamic_cast 支持运行时识别指针或引用所指向的对象。
  ③const_cast  将转换掉表达式的const性质。只有使用const_cast才能将const性质转换掉。
  ④reinterpret_cast 通常为操作数的位模式提供较低层次的重新解释。
 虽然标准C++仍然支持旧式强制转换符号,但是我们建议,只有在C语言或标准C++之前的编译器上编写代码时,才使用这种老的语法。
8、对于switch结构,只能在它的最后一个case标号或default标号后面定义变量。制定这个规则是为了避免出现代码跳过变量的定义和初始化的情况。如果需要为某个特殊的case定义变量,则可以引入块语句,在该块语句中定义变量,从而保证这个变量在使用前被定义和初始化。
9、在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。
10、throw 系统通过throw表达式抛出异常。throw表达式由关键字throw以及尾随的表达式组成,通常以分号结束,这样它就成为了表达式语句。throw表达式的类型决定了所抛出异常的类型。
11、try块的通用语法形式是:
    try{
   program-statements
   }catch(exception-specifier){
   handler-statements
    }
    catch(exception-sepcifier){
   handler-statements
    }//...
  try语句内的program-statement形成程序的正常逻辑。这里面可以包含任意C++语句,包括变量声明。与其他块语句一样,try块引入局部作用域,在try块中声明的变量,包括catch字句中声明的变量,不能在try外面引用。
12、寻找处理代码的过程与函数调用链刚好相反,抛出一个异常时,首先要搜索的是抛出异常的函数,如果没有找到匹配的catch,则终止这个函数的执行,并在调用这个函数的函数中寻找相匹配的catch。如果仍然没有找到相应的处理代码,该函数同样要终止,搜索调用它的函数。如此类推,继续按执行路径回退,直到找到适当类型的catch为止。
   如果不存在处理该异常的catch子句,程序的运行就要跳转到名为terminate的标准库函数,该函数在exception头文件中定义。这个标准库函数的行为依赖于系统,通常情况下,它的执行将导致程序非正常退出。
   在程序中出现的异常,如果没有经try块定义,则都以相同的方式来处理。此时,如果发生了异常,系统将自动调用terminate终止程序的执行。
13、标准异常
①、<exception>头文件定义了最常见的异常类,它的类名是exception。这个类只通知异常的产生,但不会提供更多的信息。
②、<stdexcept>头文件定义了几种常见的异常类。
③、<new>头文件定义了bad_alloc异常类型,提供因无法分配内存而由new抛出的异常
④、<type_info>头文件定义了bad_cast异常类型。
14、使用预处理器进行调试
①、#ifndef NDEBUG
    ...
    #endif
   预处理器还定义了其余四种在调试时非常有用的常量:
    _ _FILE__  文件名
    _ _LINE__  当前行号
    _ _TIME__  文件被编译的时间
    _ _DATE__  文件被编译的日期
②、使用NDEBUG预处理变量以及assert预处理宏。assert宏在<cassert>头文件中定义的。
assert(expr)只要NDEBUG未定义,assert宏就求解条件表达式expr,如果结果为false,assert输出信息,并且终止程序的执行。assert仅用于检查确实不可能的条件,这只对程序的调试有帮助,但不能用来代替运行时的逻辑检查,也不能代替对程序可能产生的错误的检测。