- 什么是函数:
A function is a block of code with a name.
: - 函数调用和返回:,实例:
- 名字有作用域(visible),对象有生命周期(exist):
,lifetime取决于object在哪定义和如何定义: - 区分default initialized和value initialized:,简单讲:而value initialization主要用于初始化容器中的元素的:
- 函数声明=函数签名=函数原型,其应该放在头文件:
- call by reference 和 call by value:,似乎call by pointer应该单拎出来,但是它就是call by value,因为它满足
When the argument value is copied, the parameter and argument are independent objects.
,只不过能间接访问指向的对象而已: - 使用call by reference能够防止argument拷贝给parameters的开销:
- low-level const不可被省略,而top-level const可以被省略:
- 对于
reference to const
的参数能用则用: - 当函数参数为数组时,需要注意的点:,数组无法被拷贝,同时当其作为实参时,数组名等于指向第一个元素的指针。所以我们不知道数组的下标范围,这需要我们提供额外的信息:第一种方案:类似于字符串存储于字符数组那样,使用结束标记。第二种方案:使用library提供的
begin()
和end()
方法确定数组边界。第三种方案使用额外的数组大小作为参数。 - 变长参数列表的函数:,其中第一种方法是
initializer_list Parameters
: - 不要使用返回局部对象的引用或指针,因为局部对象的lifetime在函数返回时结束:
- 定义一个返回数组的函数:
- 花哨的函数声明方式:
- 函数重载与const参数:
- 函数匹配(重载函数解析):
default arguments
的使用,为了使用这种特性,我们需要保证很少用默认参数的parameters放在前面:- 声明一个函数为
inline
时,机器可能会将其在编译时展开成表达式,从而减少函数调用时的运行开销: constexpr
关键字:,有些抽象:- assert
是先于编译器处理的预处理器
macro,它受预处理器变量
NDEBUG`的影响: - 函数匹配过程中涉及的候选函数和可行函数:,尽可能的进行最佳匹配:
- 指向函数的指针:,函数指针的使用: