C++ Primer:第6章总结


第6章 函数

6.1 函数基础

基本内容:

  1. 函数定义组成:返回类型,函数名,形参列表,函数体。
  2. 主调函数和被调函数,形参和实参,函数返回类型。
  3. 局部变量:形参和函数体内部定义的变量。自动对象:只存在于块执行期间的对象。局部静态变量:初次使用时才被初始化,即使它所在函数已执行结束,也要等到程序终止才被销毁。
  4. 函数声明(函数原型):只能定义一次,可声明多次。函数声明无需函数体,以分号结尾。
  5. 分离式编译。

备注:

  1. 函数返回类型为void,表示函数不返回任何值。函数不能返回数组或函数,但可以返回指向数组或函数的指针。
  2. 局部变量仅在函数作用域内可见,会隐藏名字(某个作用域内声明的名字会隐藏掉外层作用域中声明的同名实体)。
  3. 内置类型的局部静态变量若未显式初始化,则执行值初始化,变量初始值为0。
  4. 若函数永远不被使用,则函数可以只声明不定义。
  5. 应在头文件内声明函数,在源文件内定义函数,且源文件应包含头文件。

6.2 参数传递

基本内容:

  1. 值传递:传值参数是非引用类型,可以是指针形参。
  2. 引用传递:传引用参数。
  3. const形参和实参:实参初始化形参与其它初始化过程一样。
  4. 数组形参、数组引用形参,传递多维数组。
  5. main:处理命令行选项。
  6. 可变形参的函数,省略符形参。

备注:

  1. 指针传递也算是值传递,指针实参与指针形参是两个指向同一对象的不同指针。修改指针形参不会改变指针实参,修改指针形参所指对象,指针实参不会改变,但其所指对象会相应改变。
  2. 引用传递可修改实参,避免对过大对象的拷贝,可返回额外信息。建议用引用形参代替指针形参。
  3. 普通引用和普通指针的形参只能使用类型匹配的实参;绑定常量的引用形参可以接受任何能转换的表达式。
  4. 尽量使用绑定常量的引用,避免造成实参可修改的误导,同时扩大函数所能接受的实参范围。
  5. 传递数组的3种方法:数组本身包含结束标记;传递指向数组首元素和尾后元素的指针;定义表示数组大小的形参。
  6. argv[0]保存程序名字,真正用户输入的参数从argv[1]开始。
  7. 传递可变形参的2种方法:传递initializer_list形参;使用可变参数模板。
  8. initializer_list对象中的元素永远是常量值,无法修改。

6.3 返回类型和return语句

基本内容:

  1. 无返回值函数,有返回值函数。
  2. 返回数组指针。

备注:

  1. 若循环中含有return语句,则循环之后也应有return语句。
  2. 函数返回引用,其实是返回所引对象的一个别名。
  3. 不要返回局部对象的引用或指针。因为函数结束后,局部变量和指针所占空间已被释放,不再指向有效的内存区域。
  4. 调用一个返回引用的函数得到左值,其它返回类型得到右值。
  5. 函数可返回花括号包括的值列表。
  6. 递归函数即直接或间接调用它自身的函数。递归函数必须有某条路径不包含递归调用,即一定要有递归终止条件,否则会出现递归循环。main函数不能调用自身。
  7. 函数返回数组指针的方法:直接返回数组指针;类型别名;decltype声明返回类型;尾置返回类型。

6.4 函数重载

基本内容:

  1. 重载函数:同一作用域内,函数名相同,形参列表不同。

备注:

  1. main函数不能递归,也不能重载。
  2. 重载函数只是形参数量或形参类型不同,不考虑返回类型,不看形参名字,忽略顶层const,区分底层const。
  3. 调用重载函数的3种可能结果:最佳匹配;无匹配;二义性调用。
  4. 不要将函数声明置于局部作用域中,因为它会隐藏外层作用域的同名实体。

6.5 特殊用途语言特性

基本内容:

  1. 默认实参,内联函数,constexpr函数。
  2. assert预处理宏,NDEBUG预处理变量。

备注:

  1. 某一形参有默认值,其后所有形参也必须有默认值;设计默认实参函数时,常修改的形参放在前面,不常修改的形参放后面;函数可多次声明,但在给定的作用域中,只能被赋予一次默认实参;除局部变量外,一般类型匹配的表达式都可作默认实参。
  2. 内联函数需在返回类型前加inline,可避免函数调用的开销。
  3. constexpr函数要求返回类型和形参类型都是字面值类型(整数和浮点数),有且只有一条return语句。constexpr函数被隐式指定为内联函数。constexpr函数的形参和返回值不一定是常量表达式。
  4. 内联函数和constexpr函数通常在头文件中定义,可多次定义,但定义必须完全一致。
  5. 若expr为真,assert什么都不做;若为假,assert输出信息并终止程序的执行。assert宏常用于检查“不能发生”的条件。
  6. 预处理变量和宏名字在程序内必须唯一。
  7. 定义NDEBUG可避免检查各种条件所需的运行时开销,相当于不进行运行时检查。

6.6 函数匹配

基本内容:

  1. 候选函数,可行函数。
  2. 最佳匹配,无匹配,二义性调用。
  3. 实参类型转换。

备注:

  1. 候选函数与被调用函数同名;其声明在调用点可见。
  2. 可行函数形参数量与实参数量相等,形参与实参类型相同或实参可转换为形参类型。
  3. 最佳匹配即形参与实参类型最匹配的可行函数,无匹配函数即未找到可行函数,二义性调用即可行函数中无最佳匹配。
  4. 最佳匹配等级:精确匹配(类型相同,数组或函数转指针,增删顶层const)>const转换>类型提升>算术类型转换>类类型转换。

6.7 函数指针

基本内容:

  1. 函数指针即指向函数的指针。

备注:

  1. 函数指针赋值时取地址符是可选的。
  2. 函数指针初始化或赋值时要求形参类型和返回类型严格匹配,不存在函数指针间转换。
  3. 函数作为值时,会自动转换成指针使用。但返回类型不会自动将函数转换成指针,必须显示将返回类型指定为指针。
  4. 以函数指针作为形参或返回值,一般使用类型别名,decltype。若是返回值,还可使用尾置返回类型。
发布了77 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34801642/article/details/104058736