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