7.1 定义函数
- 可以将函数分成两类,没有返回值的函数和有返回值的函数,有返回值的函数,必须使用返回语句,以编将值返回给调用函数,值本身可以时常量,变量,也可以是表达式,只是其结果的类型必须为typeName类型或者可以被转换为typeName类型,通过函数将返回值复制到指定的CPU寄存器或内存单元中将其返回,随后,调用函数将查看该内存单元
- 函数原型是一条语句,必须以分号结束,函数原型不要求提供变量名,函数原型的主要功能
- 编译器正确处理函数返回值
- 编译器检查使用的参数数目是否正确
- 编译器检查使用的参数类型是否正确;如果不正确,则转换为正确的类型
7.2 函数参数和按值传递
- C++通常按值传递参数,这意味着将数值参数传递给函数,而后者将其赋给一个新的变量
- 【double volume = cube(side); double cube(double x)】被调用时,cube函数将创建一个新的名为x的double变量,并将其初始化为某值,因为cube()使用的是side的副本,而不是原来的数据。用来传递值的变量被称为形参,传递给函数的值被称为实参
- 在函数调用时,计算机将为局部变量分配内存,在函数结束时,计算机将释放这些变量使用的内存
7.3 函数和数组
- 在大多数情况下,C++和C语言一样,将数组名是为指针,C++将数组名解释为其第一个元素的地址
- 传递常规变量时,函数将使用该变量的拷贝,但传递数组时,函数将使用原来的数组,将数组地址作为参数可以节省复制整个数组所需的时间和内存,如果数组很大,使用拷贝的系统开销将非常大,程序不仅需要更多的计算机内存,还需要花费时间来复制大块的数,另一方面,使用原始数据增加了破坏数据的风险
- 将指针参数声明为指向常量数据的指针有两条理由
- 这样可以避免由于无意间修改数据而导致的编程错误
- 使用const使得函数能够处理const和非const实参,否则将只能接受非const数据,如果条件允许,则应将指针形参声明为指向const的指针
7.5 函数和C风格字符串【C风格字符串和常规char数据重要区别:字符串有内置的结束字符,意味着不必将字符串长度作为参数传递给函数,而函数可以使用循环依次检查字符串中的每个字符,直到遇到结尾的空值字符为止】
- char数组
- 用引号括起来的字符串常量
- 被设置为字符串的地址的char指针
7.10 函数指针
-
函数指针的基础知识
- 获取函数的地址,如果think()是一个函数,则think就是该函数的地址,要将函数作为参数进行传递,必须传递函数名
- 声明函数指针,函数指针声明应指定函数的返回类型以及函数的参数列表
【double pam(int) —> double (*pf)(int)】由于pam是函数,因此(*pf)也是函数,pf就是函数指针, *pf(int)意味着pf()是一个返回指针的函数,而(*pf)(int)意味着pf是一个指向函数的指针 - 使用指针来调用函数,使用(*pf)时,只需将它看作函数名即可