总结: 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);