chapter4_组织程序和数据

  1. 异常也是一个

     class exception
     {
         ...
     }
    
     class logic_error : public exception
     {
         ...
     }
    
     class domain_error : public logic_error
     {
         ...
     }
    
  2. 引用

     std::vector<int> a;    // 原始变量
    
     std::vector<int>& b = a;     // b是a的一个替代名,对b的改动就是对a的改动,对a的改动就是对b的改动
    
     const std::vector<int>& c = b;    // c是b的一个**只读**替代名
    
     std::vector<int>& d = c;    // 这里会报错,因为c被const修饰只能只读,d不被const修饰代表它可以改,产生了矛盾所以报错
    

    总结:

     (1) 常量引用可以指向非常量引用(例如c)
    
     (2) 非常量引用不能指向常量引用(例如d)
    
     (3) **与非常量引用参数对应的参数,必须是左值**
    
     eg. istream& read_hw(istream& in, std::vector<double>& hw)函数,hw要传入一个左值才行
    
  3. 引用作为函数的返回值

    1. 函数返回时不复制对象

    2. 返回引用可以作为左值,可以链式运算

    左值:可以放在运算符左边的变量(可以被赋值的值)

  4. 原则:一条语句中的副作用个数不会超过一个

    例如:抛出异常的那条语句,不太适合放在输入/输出语句中,因为异常是一个副作用,输入/输出也是副作用

  5. 谓词

    1. 定义:一个函数,可以产生真值(一般是bool)

    2. 示例

      <algorithm>中的std::sort方法

           template<typename _RAIter, typename _Compare>
           void sort(_RAIter, _RAIter, _Compare);
      

      的第三个参数需要一个谓词

  6. 分块编译

    1. #include “xxx” 代表编译器把此名称对应的头文件中的所有内容都复制到程序中

    2. #include <yyy> 代表使用系统环境提供的头文件

         #ifndef xxx
    
         #define xxx
    
         ...
    
         #endif
    
     ifndef是预处理命令,作用是,如果xxx未被定义,就做和 #endif 之间的动作,否则跳过;
    
     作用是防止一个头文件被多次#include,造成**重复包含**。
    
     重复包含的意思是:每次#include,都会把这个文件复制一份,相当于一个程序中定义了同一作用域下两个名字相同的类,所以会*编译期报错*
    
    1. 在头文件中尽量不要使用 using,因为它可能被#include,而用户可能不需要真的用 using,比较乱

    2. 在源文件中可以使用 using,因为只影响到局部

  7. inline

    1. 作用:请求编译器把调用扩展成内联子过程——为了避免函数调用的额外开销,编译器会用函数体的一个复制来替换对函数的每一个调用,并根据需要进行修正

    2. 要想实现内联,编译器必须看到函数体 --> inline函数通常在头文件中定义,而非源文件中定义

    3. inline只是提示编译器,编译器有权不内联

猜你喜欢

转载自blog.csdn.net/captxb/article/details/103038840