C++ Primer 笔记4

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(type name)、sizeof(expr)、sizeof expr
    数组元素的个数: int sz = sizeof(ia) / sizeof(*ia);
5、逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算,逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值。
6、int *pi = new int;    // pi points to an uninitialized int
    int *pi = new int(); // pi points 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仅用于检查确实不可能的条件,这只对程序的调试有帮助,但不能用来代替运行时的逻辑检查,也不能代替对程序可能产生的错误的检测。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值