没有规定实参的求值顺序,编译器能以任意可行的顺序对实参求值
形参不能同名,函数最外层作用域的局部变量也不能和形参同名
函数的返回类型不能是数组和函数类型
自动对象有初始值就用之进行初始化,否则进行默认初始化
局部静态对象没有初始值就进行值初始化,内置类型的局部静态变量初始化为0
函数声明的形参无须名字
变量和函数要在头文件中声明,源文件中定义
定义函数的源文件要包含函数声明的头文件
使用引用修饰形参可以避免拷贝
形参的顶层const会被忽略,可能导致重复定义
给形参传数组其实是传了个指针,所以函数一开始并不知道数组的确切尺寸
形参指定数组维度,但实际上的实参并不一定
initializer_list对象中的元素永远是常量值,不能改变其值
向initializer_list形参传值必须把序列放在一对花括号内
ErrCode类型用来表示不同类型的错误,有一个msg成员函数
省略符形参使用了varargs的C标准库功能,大多数类型的对象在传递给省略符形参时都无法正确拷贝
返回局部对象及其引用和指针都会产生错误
可以返回一个列表,但如果是内置类型的话可以返回一个列表,但如果是内置类型的话,列表最多包含一个值,并且不能大于目标类型的空间
cstdlib中定义了两个预处理变量,使返回值与机器无关,EXIT_FAILURE和EXIT_SUCCESS
函数重载时不能只有返回类型不同,顶层const无法用于重载
内层作用域的名字可以隐藏外层作用域的同名实体,内部变量名可以隐藏外部函数名
C++中,名字查找发生在类型检查之前
默认形参后的所有形参都必须有默认值,调用时只能省略尾部实参
char类型的实参可以隐式转换为无符号类型
函数的后续声明只能为之前函数的后续声明只能为之前没有默认值的形参添加默认实参,不能修改之前的默认实参
用作默认实参的名字在函数声明所在的作用域解析,而名字的求值过程发生在函数调用时
内联函数可以避免函数调用的开销,但编译器可以选择忽略内联的请求
constexpr函数:指能用于常量表达式的函数,返回类型和形参类型都得是字面值类型,函数体中只能有一条return语句(其他语句在运行时不执行任何操作才行,如空语句,类型别名,using声明),被隐式指定为内联函数。返回值可以不是一个常量表达式,但此时不能放在需要常量表达式的地方(当形参不是常量时,返回的就不是常量表达式了)
内联函数和constexpr函数可以多次定义,但定义必须一致,所以通常定义在头文件中
assert:预处理宏,是一个预处理变量,表达式为真时什么都不做,假时输出信息并终止程序
依赖于NDEBUG,如果没有定义NDEBUG,则assert进行运行时检查
如果定义了NDEBUG,则assert什么都不做
_ _ func _ _:编译器定义的一个局部静态变量,用于存放函数的名字
预处理器定义的名字有:
函数匹配:每个实参的匹配都不劣于其他,至少一个实参的匹配优于其他
所有算术类型的转换级别都一样
函数名会自动转换为函数指针
指向不同类型的函数指针之间不存在转换规则