1、概述
一个较大的程序一般划分为若干个程序模块,每一个模块实现一部分功能。程序是从main函数开始的,由main函数调用其他函数,其他函数相互调用,但其他函数不能调用main函数。 main函数 是由系统调用的。
如果main函数的位置在其他两个函数之前,在main函数调用其他函数之前,必须对其他函数进行声明。
2、定义函数的一般形式
定义无参函数的一般形式: 定义有参函数的一般形式:
类型标识符 函数名(viod) 类型标识符 函数名(形式参数列表)
{ {
声明部分 声明部分
语句 语句
} }
定义无参函数时,也可以将void省略掉,如 void prinstar();
3、函数参数和函数的值
3.1、形式参数和实际参数
在定义函数时函数名后面括号中的变量名称为形式参数,在主调函数中调用一个函数时,函数名后面括号中的参数称为实际参数。
(1)在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们为形式参数或虚拟参数。
(2)在定义函数时,必须在函数首部指定形参的类型。
(3)实参与形参的类型应相同或赋值兼容。如果实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,以形参为主。
(4)实参变量对形参变量的数据传递是“值传递”,即单向传递,只能由实参传给形参,而不能由形参传回给实参。
3.2、函数的返回值
如果需要从被调用函数带回一个函数值,被调用函数中必须包含return语句。如果不需要从被调函数带回函数值,则可以不要return语句。
如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准,即函数类型决定返回值的类型,对数值型数据,可以自动进行类型转换。
4、函数的调用
4.1 函数调用的方式
1、函数语句
printstar();
2、函数表达式
c = 2*max(a,b);
3、函数参数
m=max(a,max(b,c));
4.2、对被调用函数的声明和函数原型
在一个函数中调用另一个函数(即被调函数)需要具备哪些条件:
(1)首先被调用的函数必须是已经存在的函数(库函数或是自己定义的函数);
(2)如果使用库函数,一般还应该在本文件开头用#include命令将有关头文件“包含”到本文件中来。
(3)如果使用用户自己定义的函数,而该函数与调用它的函数在同一个程序单元中,且位置在主调函数之后,则必须在调用此函数之前对被调用的函数作声明。
函数声明的位置可以在待用函数所在的函数中,也可以在函数之外。如果函数声明放在函数的外部,在所用函数定义之前,则在各个主调函数中不必对所调用的函数再作声明。
5、内置函数
调用函数时需要一定的时间和空间的开销。c++提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(inline).
指定内置函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。
#include<iostream>
#include<iomanip>
using namespace std;
inline int max(int,int,int);//声明函数,注意左端有inline
int main()
{int i = 10,j = 20,k = 30,m;
m = max(i,j,k);
cout<<"max="<<m<<endl;
return 0;
}
inline int max(int a,int b,int c)
{
if (b>a) a=b;
if(c>a) a=c;
return a;
}
注意:可以在声明函数和定义函数同时写inline,也可以只在其中一处声明inline,效果相同,都能按内置函数处理。
内置函数不能包括复杂的控制语句,如循环语句和switch语句。
归纳起来,只有那些规模较小而又被频繁调用的简单函数,才适合声明为inline函数。