1.2 函数
1.?函数的定义
一个C程序是由若干个函数组成的,C语言被认为是面向函数的语言,而C++面向过程的程序设计也沿用了C语言使用函数的方法。在C++面向对象的程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类中的函数。无论是C还是C++,程序中的各项操作基本上都是由函数来实现的,程序编写者要根据需要编写一个个函数,每个函数用来实现某一功能。因此,读者必须掌握函数的概念以及学会使用和设计函数。
定义函数的一般格式是:
返回值类型 函数名([形参])
{
函数体
}
在定义函数时函数名后面括号中的变量名称是形参。在主调中调用一个函数时,函数名后面括号中的参数是实参。
【例1.2】 函数、形参、实参的使用举例。
#include<iostream>
using namespace std;
int min(int a,int b){ // 这里的min就是函数名,a、b是形参,
// 返回值是一个int整型
if(a<b)return a;
else return b;
}
int main(){
int a=10,b=1;
cout<<min(a,b)<<endl; // 这里的a、b是实参
return 0;
}
函数的执行结果是:
1
例1.2中定义了一个函数,有2个整型的参数,且返回值是整型的,在main函数中调用min函数时,传入的是实参。
形参与实参的区别是:形参只有被调用时才分配内存单元,在调用结束时,立即释放所分配的内存单元。实参与形参的类型应相同或赋值兼容。
2.?函数重载
C++允许用同一函数名定义多个函数,但这些函数必须参数个数不同或类型不同,这就是函数重载。例1.3说明了函数重载的使用方法。
【例1.3】 求不同类型的数中的最小者。
#include<iostream>
using namespace std;
int min(int a, int b, int c){
if(a>b)a=b;
if(a>c)a=c;
return a;
}
long long min(long long a,long long b, long long c){
// 与上面那个函数的差别是参数的类型不同
if(a>b)a=b;
if(a>c)a=c;
return a;
}
double min(double a, double b){ // 这个函数与以上的差别是只有2个参数
if(a-b>(1e-5))a=b;
return a;
}
int main(){
int a=1,b=2,c=3;
cout<<min(a,b,c)<<endl;
long long a1=100,b1=200,c1=300;
cout<<min(a1,b1,c1)<<endl;
double a2=1.1,b2=2.2;
cout<<min(a2,b2)<<endl;
return 0;
}
程序的执行结果是:
1
100
1.1
这里分别需要比较3个整数、3个长整数和2个浮点数,并获得各组中的最小值。例1.3中分别定义了3个函数,而且函数名都是一样的,不过参数个数不一样或者参数类型不一样,这就是使用了函数重载来实现功能。
在使用函数重载时,同名函数的功能应当相同或相近,不要用同一函数名去实现几个完全不相干的功能,这样虽然程序能运行,但是可读性不好,会让人觉得莫名其妙。
3.?函数模板
函数模板,实际上是建立一个通用函数,其函数类型和形参不具体指定,而用一个虚拟的类型来代表,这个通用函数就是函数模板。凡是函数体相同的函数都可以用这个模板来代替,而不用定义多个函数,实际使用时只需在模板中定义一次就可以了。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。
定义函数模板的一般格式是:
template<typename T>
下面的程序说明了函数模板的使用方法。
【例1.4】 函数模板使用举例。
#include<iostream>
using namespace std;
template<typename T>
T min(T a,T b,T c){
if(a>b)a=b;
if(a>c)a=c;
return a;
}
int main(){
int a=1,b=2,c=3;
cout<<min(a,b,c)<<endl;
long long a1=1000000000,b1=2000000000,c1=3000000000;
cout<<min(a1,b1,c1)<<endl;
return 0;
}
程序输出结果:
1
1000000000
例1.4中定义了一个函数模板,用来获得3个数中的最小者。若传入3个整型的,函数就将虚拟类型T转成int去执行;若传入3个长整型的,函数就将T转化成long long去执行。这样就可以不用定义类型不同的函数了,只需一个函数模板即可搞定。
在编写函数模板时,可以先写一个函数,然后把其中的变量类型都替换成虚拟类型即可。可以看到,用函数模板比函数重载更方便,但是它只适用于函数个数相同而类型不同的情况。