C++ Primer 第六章 函数

文章目录

  • 1. 函数基础
      • 0.1.1 编写函数
      • 0.1.2 调用函数
      • 0.1.3 形参和实参
      • 0.1.4 函数的形参列表
    • 1.1 局部变量
      • 1.1.1 自动变量
      • 1.1.2 局部静态变量
    • 1.2 函数声明
      • 1.2.1 在头文件中进行函数声明
    • 1.3 分离式编译
  • 2.参数传递
    • 2.1 传值参数
      • 2.1.1 指针形参
    • 2.2 传引用参数
      • 2.2.1 使用引用避免拷贝
      • 2.2.2 使用引用形参返回额外信息
    • 2.3 const 形参和实参
      • 2.3.1 指针或引用形参与const
      • 2.3.2 尽量使用常量引用
    • 2.4 数组形参
      • 2.4.1 使用标记指定数组长度
      • 2.4.2 使用标准库规范
      • 2.4.3 显式传递一个表示数组大小的形参
      • 2.4.4 数组形参和const
      • 2.4.5 数组引用形参
      • 2.4.6 传递多维数组
    • 2.5 main:处理命令行选项
    • 2.6 含有可变形参的函数
      • 2.6.1 initializer_list 形参
      • 2.6.2 省略符形参
  • 3. 返回类型和 return 语句
    • 3.1 无返回值函数
    • 3.2 有返回值函数
      • 3.2.1 值式如何被返回的
      • 3.2.2 不要返回局部对象的引用或指针
      • 3.2.3 返回类类型的函数和调用运算符
      • 3.2.4 引用返回左值
      • 3.2.5 列表初始化返回值
      • 3.2.6 主函数 main 的返回值
      • 3.2.7 递归
    • 3.3 返回数组指针
      • 3.3.1 声明一个返回数组指针的函数
      • 3.3.2 使用尾置返回类型
      • 3.3.3 使用decltype
  • 4. 函数重载
      • 4.0.1 定义函数重载
      • 4.0.2 判断两个形参的类型是否相异
      • 4.0.3 重载和const 形参
      • 4.0.4 const_cast 和重载
      • 4.0.5 调用重载函数
    • 4.1 重载和作用域
  • 5. 特殊用途语言特性
    • 5.1 默认实参
      • 5.1.1 使用默认实参调用函数
      • 5.1.2 默认实参初始值
    • 5.2 内联函数和constexpr函数
      • 5.2.1 内联函数可避免函数调用的开销
      • 5.2.2 constexpr函数
      • 5.2.3 把内联函数和constexpr函数放在头文件
    • 5.3 调试帮助
      • 5.3.1 assert 预处理宏
      • 5.3.2 NDEBUG 预处理变量
  • 6. 函数匹配
      • 确定候选函数和可行函数
      • 寻找最佳匹配
      • 含有多个形参的函数匹配
    • 6.1 实参类型转换
      • 6.1.1 需要类型提升和算术类型转换的匹配
      • 6.1.2 函数匹配和const 实参
  • 7. 函数指针
      • 7.0.1 使用函数指针
      • 7.0.2 重载函数的指针
      • 7.0.3 函数指针形参
      • 7.0.4 返回指向函数的指针
      • 7.0.5 将auto和decltype用于函数指针类型

函数是一个命名了 代码块,通过调用函数来执行相应的代码。函数有0个或者多个参数,而且通常会产生一个结果。可以重载函数。

1. 函数基础

一个典型的函数(function)定义包括以下部分:
返回类型(return type)
函数名字
0个或者多个形参(parameter)组成的列表
函数体(function body)

0.1.1 编写函数

0.1.2 调用函数

0.1.3 形参和实参

实参是形参的初始值。
实参的类型必须和对应的形参匹配。

0.1.4 函数的形参列表

形参列表中的形参通常用逗号隔开,其中每个形参都有一个声明符的声明。即使两个形参的类型一样,也必须把两个类型写出来:
int f3(int v1, v2) {/* ...*/ } //错误
int f4(int v3, int v4) {/*...*} //正确

1.1 局部变量

名字 – 作用域
对象 – 生命周期

  • 名字的作用域是程序文本的一部分,名字在其中可见
  • 对象的生命周期是程序执行过程中对象存在的一段时间

形参和函数体内d定义的变量都称为局部变量(local variable)

1.1.1 自动变量

只存在于块执行期间的对象称为自动对象(automatic object)
形参是一种自动变量。函数开始时为形参申请存储空间,因为形参在函数体作用域之内,所以一旦函数终止,形参也自动被销毁

1.1.2 局部静态变量

1.2 函数声明

函数的名字也必须在使用之前声明
函数只能定义一次,但可以多次声明

函数的三要素(返回类型,函数名,形参类型)描述了函数的接口,说明了调用该函数所需的信息
函数声明也叫函数原型(function prototype)

1.2.1 在头文件中进行函数声明

一般建议:变量和函数都应该在头文件中声明,在源文件中定义

含有函数声明的头文件应该被包含到定义函数的源文件中,编译器负责验证函数的定义和声明是否匹配

1.3 分离式编译

2.参数传递

形参的类型决定了形参和实参的交互方式
如果形参是引用类型,它将绑定到对应的实参上
否则实参的值拷贝后赋值给形参

2.1 传值参数

函数对形参的所有操作都不会影响到实参

2.1.1 指针形参

执行指针拷贝操作时,拷贝的是指针的值。拷贝之后,两个指针式不同的指针。

2.2 传引用参数

对引用的操作实际上是作用在引用所引的对象上

2.2.1 使用引用避免拷贝

拷贝大的类类型对象或者容器对象比较低效,甚至有些类类型对象根本不支持拷贝操作

2.2.2 使用引用形参返回额外信息

2.3 const 形参和实参

2.3.1 指针或引用形参与const

2.3.2 尽量使用常量引用

2.4 数组形参

数组的两个特殊特性:

  1. 不允许拷贝数组
  2. 使用数组时将其转换为指针。

因为数组会被转换为指针,所以但我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针

管理指针形参的三种常见技术:

2.4.1 使用标记指定数组长度

2.4.2 使用标准库规范

2.4.3 显式传递一个表示数组大小的形参

2.4.4 数组形参和const

2.4.5 数组引用形参

2.4.6 传递多维数组

2.5 main:处理命令行选项

命令选项通过两个(可选的)形参传递给main函数:
int main( int argc, char *argv[ ]) {...}
第一个形参 argc 表示数组中字符串的数量,
第二个形参 argv 是一个数组,它的元素是指向C风格字符串的指针
也可以写成:
int main( int argc, char **argv) {...}
argv 是指向 char *

当使用argv中的实参时,可选的实参是从==argv[1]==开始,argv[0]保存程序的名字,而不是用户的输入

2.6 含有可变形参的函数

2.6.1 initializer_list 形参

2.6.2 省略符形参

3. 返回类型和 return 语句

3.1 无返回值函数

3.2 有返回值函数

3.2.1 值式如何被返回的

3.2.2 不要返回局部对象的引用或指针

3.2.3 返回类类型的函数和调用运算符

3.2.4 引用返回左值

3.2.5 列表初始化返回值

3.2.6 主函数 main 的返回值

3.2.7 递归

3.3 返回数组指针

3.3.1 声明一个返回数组指针的函数

3.3.2 使用尾置返回类型

3.3.3 使用decltype

4. 函数重载

如果一作用域内的几个函数名字相同但形参列表不同,我们称之为重载(overload)函数

4.0.1 定义函数重载

4.0.2 判断两个形参的类型是否相异

4.0.3 重载和const 形参

4.0.4 const_cast 和重载

4.0.5 调用重载函数

4.1 重载和作用域

5. 特殊用途语言特性

5.1 默认实参

5.1.1 使用默认实参调用函数

5.1.2 默认实参初始值

5.2 内联函数和constexpr函数

5.2.1 内联函数可避免函数调用的开销

5.2.2 constexpr函数

5.2.3 把内联函数和constexpr函数放在头文件

5.3 调试帮助

5.3.1 assert 预处理宏

5.3.2 NDEBUG 预处理变量

6. 函数匹配

确定候选函数和可行函数

寻找最佳匹配

含有多个形参的函数匹配

6.1 实参类型转换

6.1.1 需要类型提升和算术类型转换的匹配

6.1.2 函数匹配和const 实参

7. 函数指针

7.0.1 使用函数指针

7.0.2 重载函数的指针

7.0.3 函数指针形参

7.0.4 返回指向函数的指针

7.0.5 将auto和decltype用于函数指针类型

待补充
第六章阅读出现困难 好多概念开始混淆 有点继续不下去下面的章节
很多不懂的都是跳着看了

你可能感兴趣的:(C++,Primer)