C++ primer 5th 第六章笔记

总结:

    6.1 基础  :
        数组 和 函数不能充当返回值, 可以使用指向他们的指针.
        自动变量: 生存周期 = 作用域
        局部静态变量: 生存周期 > 作用域
      	函数声明 = 函数原型

     6.2 参数传递:
        值传递: 变量,指针,函数(传值调用)
        引用传递 : 避免大量拷贝,const 修饰能扩大其类型容纳范围。
        
        形参的顶层const会被忽略掉.
        
        数组当作参数会被退化成指针 [ 指向下一维度数组指针]
            解决方式:
                  1.使用整数形参 说明其退化前的维度 
                  2.使用数组引用方式传递, 但是就只能传递固定维度的数组了
        
        可变参数列表:
            1.initializer_list :
                内部全是const, 且拷贝赋值共享元素.
            2.可变参数模板
            3.C接口的 ... , 此时应该使用C支持的数据类型当作实际参数.

     6.3 return : 
         使用返回值初始化一个临时量。
         
         C++11规定可以返回 {}, 只要接受的数据能接受 [ 返回类型不能是数组类型]
        
         返回指向数组的指针的方式:[引用也适用]
         1.类型别名:
            using arrT = int[10];
            arrT *func(int);
         
         2.不使用类型别名:
            int (*func(int))[10];
            
         3.尾置返回类型[C++11]
            auto func()->int(*)[10];
         4.decltype方式:
           int a[10];
           decltype(a) *func();
     
      6.4 函数重载:
         返回类型, 顶层const不能充当重载的条件。
         
         const_cast 可以让非常量版本函数调用 常量版本的函数。[指针 和 引用类型形参]

      6.5 特殊的语言特性:
        	默认实参:
           		 书写在都文件当中,可多次定义.
        	内联函数:
            		定义在头文件, 可展开, 无复杂控制语句的函数
      		 constexpr 函数:
            		参数类型 和 返回值都必须是字面值类型。
           		 函数体只能有一条return 语句
           		 返回值是否是constexpr 看参数。
        	调试帮助:
         		   cassert 头文件中的宏, 以及__func__ 和 __FILE__,__TIME__,
__LINE__,__TIME__ 等预处理变量
     6.6 函数匹配:
           候选函数集合 : 名字 和 可见性来筛选
           可行函数集合 : 参数的数量 和 可行的类型匹配筛选
           最佳匹配: 每单个参数来看, 如果每个参数的最佳匹配相同就有最佳匹配, 否则ambiguous [
           有一套等级划分来决定类型匹配的优劣 ]
     6.7 函数指针:
            参数是函数指针:
                    void func(int f(int,int))
                    void func(int (*pf)(int,int)) //等价于上
            返回函数的指针:
                   别名方式: 
                       	   using funcType = int (int, int);
                       	   funcType * func(); 
                   不用别名方式             
                       	    int (*func())(int, int){}
                   尾巴置类型放复杂类型:
                       	    auto func() -> int (*)(int, int);

猜你喜欢

转载自www.cnblogs.com/Geek-Z/p/10087683.html