Chapter7 函数--C++的编程模块

Chapter7 函数–C++的编程模块

7.1 复习函数基本知识

7.1.1 定义函数

可以将函数分为两类:没有返回值的函数和有返回值的函数。没有返回值的函数称为void函数,其通用格式如下:

1
2
3
4
void functionName(parameterList){
statement(s);
return ;//optional
}

可选的返回语句标记了函数的结尾;否则,函数将在右花括号处结束。void函数相当与Pascal中的过程、FORTRAN中的子程序和现代BASIC中的子程序过程。

对于有返回值的函数,必须使用返回语句,C++对与有返回值的类型有一定的限制:不能是数组,但可以是其他任何类型(虽然C++函数不能直接返回数组,但可以将数组作为结构或对象组成部分来返回)。

通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中来将其返回。随后,调用程序将查看该内存单元。返回函数和调用函数必须就该内存单元中存储的数据的类型达成一致。

7.1.2 函数原型和函数调用

1.为什么需要原型
原型描述了函数到编译器的接口,也就是说,它将函数返回值的类型(如果有)以及参数的类型和数量告诉编译器。
2.原型的语法
函数原型是一条语句,因此必须以分号结束。获得原型最简单的方法是,复制函数定义中的函数头,并添加分号。(函数原型不要求提供变量名,有类型列表就足够了)。
3.原型的功能
原型可以极大地降低程序出错的机率,它们确保以下几点:
(1)编译器正确处理函数返回值;
(2)编译器检查使用的参数数目是否正确;
(3)编译器检查使用的参数类型是否正确;

ANSI C中原型是可选的,而在C++中,原型是必不可少的。在C++中,括号为空与在括号中使用关键字void是等效的–意味着函数没有参数。在ANSI C中,括号为空意味着不指出参数–这意味着将在后面定义参数列表。而在C++中,不指定参数列表时应使用省略号。

7.2 函数参数和按值传递

C++标准使用参数(argument)来表示实参,使用参量(parameter)来表示形参,因此参数传递将参量赋给参数。

形参与其他局部变量的主要区别是,形参从调用函数哪里获得自己的值,而其他变量是从函数中获得自己的值。

7.3 函数和数组

在C++中,当(且仅当)用于函数头或函数原型中,int * arr和int arr[]的含义才是相同的。它们都意味着arr是一个int指针。然而数组表示法(int arr[])提醒用户,arr不仅指向int,还指向int数组的第一个int。

传递常规变量时,函数将使用该变量的拷贝;但传递数组时,函数将使用原来的数组。

必须显式传递数组的长度,因为指针并未指出数组的长度

可以用两种不同的方式将const关键字用于指针。第一种是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值,第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置

如果数据类型本身不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针。

7.4 函数指针

函数的地址是存储器机器语言代码的内存的开始地址。

  • 获取函数的地址

    获取函数的地址很简单:只要使用函数名(后面不跟参数)即可。也就是说,如果think()是一个函数,那么think就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。

  • 声明函数指针

    声明指向某种数据类型的指针时,必须指定指针指向的类型。同样,声明指向函数的指针时,也必须指定指针指向的函数类型,这意味着声明应指定函数的返回类型以及函数的特征标(参数列表)通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*pf)替换函数名,这样pf就是这类函数的指针。

函数定义是实现函数功能的代码;函数原型提供了函数的接口:传递给函数的值的数目和种类以及函数的返回类型。函数调用使得程序将参数传递给函数,并执行函数的代码。