博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C++ Primer 读书笔记 Chapter 7 函数

Posted on 2010-08-18 00:14  KurtWang  阅读(450)  评论(0编辑  收藏  举报
  1. 参数传递:
    1. 如果形参是非引用,则复制实参,如果只是引用,则只是实参的别名
    2. const形参:具有const或非const形参的函数无区别,e.g. void fcn(const int i) 和 void fcn(int i)是重复定义
    3. 复制实参的局限性:1.需要修改实参 2. 大型对象 3. 无法实现对象复制。可定义为引用和指针类型
    4. 建议使用const引用形参
      1. 如果使用引用形参唯一目的是避免复制,则应该定义为const引用
      2. 使用非const引用形参坏处
        1. 非const引用形参只能与完全同类型的非const对象关联。
        2. 使用非const引用形参,不能用const对象初始化
        3. 不能用字面值或产生右值的表达式实参
    5. vector应该使用iterator传递
    6. 数组形参
      1. 编译器会忽略数组形参的长度 e.g. void printValue(const int ia[10]);  int i=0; j[2]={0,1}; printValue(&i); printValue(j); 正确
      2. 数组实参:非引用形参会被转换为指针;引用形参会严格匹配数组大小 e.g. void printValue( int (&arr)[10] )
      3. 显式传递数组大小的形参
    7. int main(int argc, char ** argv);
  2. return 返回值
    1. 返回非引用:创建临时对象
    2. 返回引用:不要返回局部变量的引用,不要返回指向局部对象的指针(局部对象会被释放)
  3. 默认实参
    1. screeninit(, , ‘?’) 错误
    2. 最少使用默认实参的形参排在最前,最可能使用默认实参的形参排在最后
    3. 在一个文件中,只能为一个形参指定默认实参一次
  4. 局部对象
    1. 自动对象:局部变量和形参
    2. 静态局部对象:不迟于在第一次经过该对象定义语句时初始化,程序结束前不会撤销
  5. 内联函数:内联函数应放在头文件中,在头文件加入或修改内联函数时,所有源文件必须重新编译
  6. 编译器隐式的将类内定义的函数当做内联函数
  7. const成员函数:函数声明 const, const成员函数不能修改调用该函数的对象
    1. const对象,指向const对象的指针或引用只能调用其const成员函数
  8. 构造函数
    1. 如果将构造函数定义为private,则不能定义该对象
    2. 如果没有定义任何构造函数,则编译器会自动生成默认构造函数
    3. 默认构造函数将依据变量初始化的规则初始化类中所有成员:
      1. 对于类类型:调用默认构造函数;
      2. 对于内置类型:如果对象在全局作用域中定义或定义为静态局部对象,则这些成员被初始化为0,否则没有初始化。
  9. 重载函数
    1. 重复声明:const对于非引用形参来说是无关的,lookup(Phone) 和 lookup(const Phone)是重复声明
    2. 函数内局部声明函数将屏蔽其他声明
    3. 重载确定的三个步骤
      1. 候选函数:选择可行函数(实参个数相同,每个实参类型匹配或者可以隐式转换)
      2. 寻找最佳匹配
      3. 多个可行函数的重载确定,如果有且仅有一个函数满足下列条件,则匹配成功
        1. 每个实参匹配都不比其他可行函数差
        2. 至少有一个比其他可行函数强
    4. 实参类型转换:等级降序如下
      1. 精确匹配
      2. 类型提升(整形提升)
      3. 标准转换
      4. 类类型转换
      5. e.g. 类型提升优先于标准转换
      6. void ff(int);
        void ff(short);
        ff('a'); //char promotes to int, matches ff(int)
    5. 重载和const形参:仅当形参是引用或指针时,形参是否为const才有影响
      1. 传递非const对象,即可用于初始化const引用,也可用于初始化非csont引用,但后者需转换来实现,而前者则是精确匹配。由此可以来确定可行函数的选择
      2. 指针和引用一样
      3. 不能用指针本身是否是const来实现函数的重载
  10. 指向函数的指针
    1. e.g. bool (*pf)(const string&, const string&);
    2. int max(int x,int y){ return(x>y?x:y); }
      void main()
      {
        int (*ptr)(int, int);
        int a,b,c;
        ptr=max;
        scanf("%d,%d",&a,&b);
        c=(*ptr)(a,b);
        printf("a=%d,b=%d,max=%d",a,b,c);
      }