函数是实现特定功能的程序段,C程序可以由主函数和多个子函数组成。

在整个软件中由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

C++语言中的函数很多是在类中定义的,因此C++函数区别于C程序的使用。

C++程序中包括两种函数形式,即标准函数与自定义函数。

  • 标准函数:即集成开发环境提供的库函数;不同的系统提供的库函数的数量和功能会有一些不同,但许多基本的函数是共同的。

  • 自定义函数:即用户在程序中编写的一些函数,可以把用户的函数加入到库函数中,从而提高程序设计效率,提高代码利用率。

写程序主要就是使用标准函数与自定义函数,然后再巧妙地串起来。

下面是一个体现函数声明、函数定义、函数调用的实例:

#include<iostream>

using namespace std;

int main()

{

int sum(int x,int y);//函数原型的声明

int a,b,c;

cin>>a>>b;

c=sum(a,b);//函数调用

cout<<c<<endl;

return 0;

}

int sum(int x,int y)//函数定义

{

int z;

z=x+y;

return (z);

}

1 声明函数

函数调用时,要先有定义,如果是多文档,当函数越来越多时,要保证顺序就很难了。所以引入了函数声明的概念,当一个函数被声明后,它就可以被直接调用,而不一定要把函数定义也放在前面,这就解决了函数调用顺序的问题。通常把各个函数的声明写在前面,然后函数定义就不要保证顺序了。

函数声明也称为函数原型,包括类型标识符、函数名和参数列表,同时在后面添加分号。为了使函数在定义之前就能被调用,C++规定可以先对函数声明,然后就可以调用函数。函数定义可以放在程序后面。函数声明与定义的返回类型、函数名称与参数表必须一致,不必包含参数的名字,可只包含参数的类型。

在C语言中建议对每一个函数建立原型进行声明,而C++中则规定必须为每一个函数建立原型。目的是在编译的时候进行检查以确定调用函数的参数和预先定义的原型是否一致。

在C++语言中有3种方法声明函数

  • 将函数原型写在头文件(.h)里,程序使用该函数时,利用#include将其包含到文件中;

  • 将函数原型写在当前文件(使用该函数的文件)中;

  • 在其他函数调用该函数前定义该函数,此时函数的定义将作为自己的声明。

2 定义函数

函数的定义由函数头和函数体两部分组成。函数头与函数原型类似,参数名称可以不同,但参数列表中的参数必须有名称,并且函数头末尾没有分号。函数体是函数实现的功能所在,由一对大括号{}}内的一组语句组成。

C++程序中函数的定义形式如下:

类型标识符 函数名(参数列表)

{

语句

}

在函数定义中,类型标志符是说明函数的返回值类型。函数名是定义此函数的名称,从而可以使用该名称来调用该函数。在函数体中包含语句,语句是完成一定功能 的函数代码。

通常,函数的调用都可以返回一个特定的值,即函数的返回值。例如比较大小的函数,如果需要得到最大的值,则利用赋值语句可以把函数的返回值赋给变量。

  • 函数的返回值通过函数的return语句获得;

  • 函数返回值的类型即函数定义的类型;

  • 当函数返回值与函数定义的类型不同时,系统自动进行转换,得到函数定义类型的返回值。

一般来说,在函数定义时都应该定义返回值的类型。如果不定义,并不是说函数没有返回值,只有将返回值定义为void类型时,函数才没有返回值。如果没有指定返回值类型,程序默认返回一个整数值,即系统会自动为函数添加一条return语句。

3 函数的一般调用

主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢

1)首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。

2)如果使用库函数,还应该在本文件开头用#include 命令将调用有关库函数时所需用到的信息“包含”到本文件中来。

3)如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明。

函数的调用由函数名称、实际参数组成。函数定义部分的参数列表为形式参数,而函数调用时,函数名后面括号中的参数则是实际参数。如果参数类型不是指针或引用,那么形式参数相当于定义的变量,而实际参数相当于变量的赋值,这种参数传送的方式叫值传递。

使用值传递有一个限制,即只能通过返回语句返回一个值。如果函数需要返回多个值,就需要采用引用传递。采用值传递实际上是将实参变量的值复制传递给形参变量,因此形参的改变不会影响实参;而采用引用传递,是将实参变量的地址传递给形参变量,因此形参变量与实参变量指向同一地址,形参变量的改变会引起实参变量的改变。在C++中,可以采用指针或引用进行引用传递。

在调用函数时,需要提供与函数原型相同的参数,即参数数量相同、参数类型兼容

3.1 函数语句

即把函数做为一条单独的语句。

#include <io;

void print(int n); //函数原型的声明

void main()

{

int num;

cin>>num;

print(num); //函数调用:函数单独作为语句

}

void print(int n) //函数定义

{

int i;

for(i=0;i<n;i++)

cout<<"I Like study"<<endl;

}

3.2 函数表达式

函数出现在一个表达式中,一般情况下函数都有返回值。

int max=2*max(a,b);

3.3 函数作为参数

函数作为其他函数的参数。

#include <io;

int max(int a,int b); //函数原型的声明

void main()

{

int maxnum;

maxnum=max(9,8); //函数调用:作为表达式的一部分

cout<<maxnum<<endl;

maxnum = max(19,max(8,9); //函数调用:作为参数

cout<<maxnum<<endl;

}

int max(int a,int b)//函数定义

{

if(a>=b)

return a;

else

return b;

}

4 函数的嵌套调用

除了主函数以外,普通函数也可以调用其他函数,也就是函数可以嵌套调用。

#include <io;

void max(int a ,int b); //函数原型的声明

void print(int n); //函数原型的声明

void main()

{

max(2,7);

}

void max(int a,int b)

{

if(a>=b)

print(a);

else

print(b); //函数定义内部调用函数

}

void print(int n)

{

cout<<n<<endl;

}

5 函数的递归调用

在调用一个函数时,直接或间接的再次调用本身,此种调用就称为函数的递归调用。函数递归调用有可能出现函数无休止调用的情况,因此函数的递归调用一定有某种跳出语句,即应当在满足某种条件下进行递归调用,否则不进行递归调用。

#include<io;

int Factorial(int); //函数原型声明

void main()

{

int n;

cin>>n;

int num;

num=Factorial(n); //函数调用

cout<<n<<"! = "<<num<<endl;

}

int Factorial(int n) //函数定义

{

if ( n == 0)

return 1;

else

return n*Factorial(n-1); //函数递归调用

}

递归的执行分为“回推”与“递推”两个阶段

如Factorial(5),

首先是回推(调用)过程:

1) 5*Factorial(4)

2) 4*Factorial(3)

3) 3*Factorial(2)

4) 2*Factorial(1)

5) 1*Factorial(0)=1

然后是递推

1) Factorial(1)=1

2) Factorial(2)=2

3) Factorial(3)=6

4) Factorial(4)=24

5) Factorial(5)=120

6 函数重载

函数重载是指多个函数具有相同的名称,但其参数不同,在调用函数时,编译器会根据参数的个数、参数的类型区分调用哪个函数。这里说的函数参数的不同可以是类型的不同,也可以是参数个数的不同。利用函数重载可以实现多态性。

#include <io;

void print(int n);

void print(float n);

void main()

{

int n=5;

float f=0.96;

print(n);

print(f);

}

void print(float n)

{

cout<<"It's a float number."<<endl;

}

void print(int f)

{

count<<"It's a float number."<<endl;

}

-End-

相关推荐