函数基础
实参:调用函数时为形参提供的初始值,与形参一一对应
局部变量:函数体内部定义的变量以及形参
自动变量:当函数的控制路径经过普通局部变量定义语句时创建该对象,当达到块末尾时销毁它
函数开始时为形参申请存储空间
局部变量定义不含初始值时执行默认初始化
局部静态对象:在程序执行路径第一次经过对象定义语句时初始化,程序终止时销毁
局部静态变量定义不含初始值时执行值初始化
分离式编译:支持将程序分割到不同文件,每个文件独立编译
1.生成可重定向文件 CC -c factMain.cc # generate factMain.o
2.将多个.o文件链接在一起形成可执行文件 CC factMain.o fact.o -o main #generate main.exe
参数传递
const参数:当用参数初始化形参时会忽略顶层const:
可以将非const实参传递给const形参;不可以将const实参传递给非const形参
数组形参:数组作为参数传递时,会转变成指针
- 确定数组界限的方式:
1. 如char*数组,结尾处有特殊符号界定
2. 传递begin和end
3.传递数组大小参数
数组引用形参:
多维数组形参:
main函数:使用argv参数时,需要从argv[1]开始,argv[0]保存程序的名字
initializer_list形参:不能修改initializer_list对象中元素的值
调用:
省略符形参:只能位于参数列表最后
返回类型和return语句
不能返回局部变量的引用:
引用返回左值:
列表初始化返回:
main的返回值:
尾置返回类型:
使用decltype:
重载
底层const可以参与重载,顶层const不可以参与重载
如果在内层作用域声明名字,将隐藏外层作用域中声明的同名实体(包括重载)
特殊用途语言特性
默认实参:后续声明可以为没有默认值的形参添加默认值,不能修改已有的默认值
内联函数:避免函数调用的开销,编译过程直接将调用处替换为函数内容
constexpr函数:能用于常量表达式的函数
返回值和所有形参类型都是字面值类型
函数体只有一条return
constexpr函数被隐式地指定为内联函数
当constexpr实参为常量表达式,它的返回值也是常量表达式;反之则不然
内敛函数和constexpr函数通常定义在头文件中
assert预处理宏:
DEBUG:
编译器定义的局部静态变量:
__func__ //函数名字
__FILE__ //文件名
__LINE__ //当前行号
__TIME__ //文件编译时间
__DATE__ //文件编译日期
函数匹配
如果有一个最优的,则返回。
如果有几个最优的并列,则报错
匹配优劣排序:
1.精确匹配
包括参数类型相同
数组/函数转换成指针
顶层const转换
2.通过const转换实现的匹配
3.通过类型提升实现的匹配
short -> int
4.通过算数类型或者指针转换
int -> unsigned int
5.通过类类型转换实现的匹配
函数指针
使用:
作为实参使用:
返回函数指针: