📄 c++5.dat
字号:
第五章 函数
第一节 函数的定义
语句是构造程序的最基本单位.当我们用程序语句编写的程序越来越大,越来越复杂的时候,为了使程序更简洁、可读性更好、更便于复用,以及更便于维护,就有必要将把它分成若干个模块,每个模块完成一项任务.在C++中,这些模块就是一个个的函数.函数也是C++语言构造程序的重要的基本单位.
函数定义的一般形式如下:
返回类型 函数名(参数表列)
{
语句系列
return 合适类型数值
}
函数的定义包括以下几个部分:
1. 函数名
2. 参数表列
3. 返回类型
4. 函数体
1. 函数名: 一个符合C++语法要求的标识符,定义函数名与定义变量名的规则是一样的,但应尽量避免用下划线开头,因为编译器常常定义一些下划线开头的变量或函数.函数名应尽可能反映函数的功能,它常常由几个单词组成.
如VC中的按下鼠标左键的响应函数为:OnLButtonDown,这样就较好的反映了函数的功能.在上例中,我们可以将"买票"和"订旅馆"作为函数名.
2. 参数表列:0个或多个变量,用于向函数传送数值或从函数带回数值,每一个参数都有自己的类型,它不同于变量定义,因为几个变量可以定义在一起,例如?quot;int i,j,k;".如果参数表列中参数个数为0,我们称之为无参函数,无参函数可以定义为:
"返回类型 函数名( ){…}"或"返回类型 函数名(void){…}"
旅行日程和目的地就是我们传送给上例中的函数的数值,当然如果你对日程和目的地都没有什么特殊的要求,那也可以完全交给旅行社一手包办,这样便相当于一个无参函数了.
3. 返回类型:指定函数用return返回的函数值的类型,如果函数没有返回值,返回类型应为void.
上例中返回值就是旅行社将要交给你的票和单据,而返回值的类型则可以看成是票和单据的类别.
4. 函数体:花括号中的语句称为函数体,一个函数的功能,通过函数体中的语句来完成.
上例中的函数体即为旅行社为买票和订旅馆进行的具体操作.
下面我们看一个具体的函数定义的例子:
例
int GetIntegerInRange(int low, int high)
{
int res;
do {
cout << "Enter an integer in the range " << low
<< " ... " << high << " :";
cin >> res;
} while (! ((res >= low) && (res <= high)));
return res;
}
int GetIntegerInRange(int low, int high)行定义函数名为GetIntegerInRange,返回类型为int,且指定函数需要两个整型值,并通过low和high引用.在函数体内定义了整型变量res,并通过return语句返回该变康闹怠?注意)变量res的类型必须与函数的返回类型一致,否则,系统以函数返回类型为准,而对res的数值进行强制类型转换,使其与函数的返回类型保持一致.
return语句的返回值通常是一个表达式,例如5-2:
一个函数也可以有多个return语句,在函数的执行过程中,遇到任一个return语句,将立即停止执行,并返回到调用函数.
例:
return res;
return n % MAXSIZE;
return 3.5 + x*(6.1 + x*(9.7 + 19.2*x));
上面的return语句也可以写成下面的形式:
return (res);
return (n % MAXSIZE);
return (3.5 + x*(6.1 + x*(9.7 + 19.2*x)));
即对返回值的表达式加一对圆括号.不过,这圆括号是多余的,可以省略掉.
这里我们用一个很简单的函数定义的例子5-4来进一步加以说明:
int Inc(int a)
{
a++;
return a;
}
这个函数的功能为增1,其中,int Inc(int a)行定义了:函数名-Inc,参数-整型数a,返回类型-整型,这说明该函数中用return语句返回的值应该是整型值.在花括号中的即为函数体,这个函数比较短,其函数体只有两行语句:
a++;
return a;
这两行语句完成a自增1的功能,返回的是a增1后的值,返回值与返回类型是匹配的.下面是一个不带有参数和返回值的函数.
第二节 函数的说明
如果一个函数调用另一个函数,在调用函数中必须对被调用函数进行说明,函数说明类似于函数定义,不过没有实现代码,函数说明的一般形式如下:
返回类型 函数名(参数表列);
函数说明是一个语句,所以要以分号结束.C++中,函数说明也称为函数原型,下面是函数说明的例子:
void PrintStats(int num, double ave, double std_dev);
int GetIntegerInRange(int low, int high);
一些函数的说明,我们放在头文件中,也有一些函数的说明放在文件的头部,而函数的定义放在该文件后面.我们知道,C++应用程序是从main函数开始执行,main函数在文件中的位置并没有特别的要求,它可以在文件的头部、中部或尾部.
第三节 函数的定义
我们定义了一个函数,完成某种功能,就要涉及到调用这个函数,调用一个函数之前必须对该函数进行说明.函数调用由函数名和函数调用运算符()组成,()内有0个或多个逗号分隔的参数(称为实参).每一个参数是一个表达式,且参数的个数与参数的类型要与被调函数定义的参数(称为形参)个数和类型匹配.
当被调函数执行时,首先计算实参表达式,并将结果值传送给形参,然后执行函数体,返回的返回值被传送到调用函数.
如果函数调用后有返回值,调用表达式可以用在表达式中,而无参函数的调用是一个单独的语句.
我们定义了一个函数,完成某种功能,就要涉及到调用这个函数,调用一个函数之前必须对该函数进行说明.函数调用由函数名和函数调用运算符()组成,()内有0个或多个逗号分隔的参数(称为实参).每一个参数是一个表达式,且参数的个数与参数的类型要与被调函数定义的参数(称为形参)个数和类型匹配.
当被调函数执行时,首先计算实参表达式,并将结果值传送给形参,然后执行函数体,返回的返回值被传送到调用函数.
如果函数调用后有返回值,调用表达式可以用在表达式中,而无参函数的调用是一个单独的语句.
例如:
#include<iostream.h> //C++库函数说明
int area(int length, int width); // area函数说明
void main() //主函数,程序从该函数开始执行
{
int this_length, this_width;
cout << "Enter the length: "; //调用cout和cin库函数
cin >> this_length;
cout << "Enter the width: ";
cin >> this_width;
cout << "\n";
cout << "The area of a " << this_length << "x" << this_width;
cout << " rectangle is " << area(this_length, this_width); //调用area函数
}
int area(int length, int width) // area函数定义
{
int number;
number = length * width;
return number;
}
3.1 对于无参函数的调用形式应该是:
函数名( )
例如,对于函数:
int TPSOKTSNK();
可以这样调用:
if(TPSOKTSNW()) {
语句系列
}
如果调用形式写成:
if(TPSOKTSNW) {
语句系列
}
它仍然符合C++语法,但意义发生了变化.它是检查函数TPSOKTNSW()是否有地址,有关地址的概念,我们在后面要讲到.如果该程序连接成功,则TPSOKTNSW()有地址,if语句的条件为真.
例如:
#include <iostream.h>
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
void main()
{
int max(int a,int b);
int x,y,z;
cout<<"input two numbers"<<endl;
cin>>x>>y;
z=max(x,y);
cout<<"maxmum="<<z;
}
程序的第2行至第6行为max函数定义.进入主函数后,因为准备调用max函数,故先对max函数进行说明(程序第9行).可以看出函数说明与函数定义中的函数头部分相同,但是末尾要加分号.程序第13行为调用max函数,并把实参x、y传送给max的形参a、b.max函数执行的结果 (a或b),返回给调用函数main中的变量z,且main函数将z值输出.
3.2参数传递
我们已经知道:函数调用时,要将调用函数中实参传送给被调函数中的形参.在C++中,有两种参数传递方式,即值传递和地址传递(或称引用传递).地址传递我们在后面介绍,这里介绍值传递的方法.
函数在被调用以前,形参变量并不占内存单元,当函数被调用时,形参变量分配有存储单元,并将相应的实参变量存储单元的值复制到形参变量单元.所以,被调函数在执行过程中,如果形参变量的值发生了变化,并不影响实参变量的值.例如:
#include <iostream.h>
void Foo (int num)
{
num = 0;
cout << "num = " << num << '\n';
}
int main (void)
{
int x = 10;
Foo(x);
cout << "x = " << x << '\n';
return 0;
}
函数Foo有一个形参变量num,当它在main函数中被调用时,实参变量x的值传送到num,且x和num在不同的内存单元中.在函数Foo中,虽然num被设置为0,但并不影响x的值,程序运行结果如下:
num = 0;
x = 10;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -