c++函数
在c++编程过程中,函数是经常用到的一个工具,它可以用来定义可重用的代码,它可以使得主函数代码看起来更加整洁,程序运行更加具有条理性,也有益于日后的修改与维护。
函数的基本概念:函数由返回值类型、函数名、参数、参数列表、函数体、返回值(有的函数可能没有返回值)组成。例如:
int pp(int n1,int n2)
{
//body
return n1;
}
这样就定义了一个函数。总的而言,函数可以这样表示:
returnValueType functionName (list of parameters)
{
//Fuction body
}
若要调用一个函数,可以这样:
int z = pp(x,y);
接下来说明一些特殊的函数
1、无返回值函数
void FunctionName (list of parameters)
{
//Function body
//这里可以不用键入return 语句
}
因为无返回值,因此不能对该函数使用赋值符号调用
此外,也可以在函数中使用return语句提前结束函数,例如:
void print(doubel score)
{
if(score>100||score<0)
{
cout<<"Invalid";
return ;
}
else
{
cout<<"goodgoodgood";
.....
}
}
也可以在头文件cstdlib中调用exit(int)函数,通过传递任意一个整数来调用这个函数显示程序中的错误。例如下面的例子,将在成绩不合法(score>100 or score<0)时调用函数终结:
void print (double score)
{
if(score<0||score>100)
{
cout<<"Ivalid";
exid(1);
}
else
{
cout<<"lalala";
....
}
}
2、函数的重载
关键点:函数的重载使你可以用同样的名称命名函数,只要函数的签名不同
当使用函数的重载时,一般是让需要处理不同数据类型,但是所要完成的任务相同的函数,取为相同的函数名。
什么意思呢,例如这样:
//接下来键入函数
int max(int num1,int num2)
{
if(num1>num2)
return num1;
else
return num2;
}
double max(double num1,double num2)
{
if(num1>num2)
return num1;
else
return num2;
}
这样,同一个max函数,既可以对两个int整型的数值进行处理,又可以对两个double类型的浮点数进行处理,并且不用担心冲突,因为编译器会选择数据类型最合适最匹配的函数执行。
而且,注意:重载函数必须有不同的参数列表,不能依据不同的返回类型重载函数。
此外,要保证不能模糊调用,模糊调用会导致一个编译错误,例如:
#include<iostream>
using namespace std;
int max(int n1,double n2)
{
if(n1>n2)
return n1;
else
return n2;
}
double max(doubel n1,int n2)
{
if(n1>n2)
return n1;
else
return n2
}
int main()
{
cout<<max(1,2)<<endl;
return 0;
}
这里因为不管是int max的函数还是double max的函数,其形式参数的数据类型都与输入的实际参数类型max(1,2)匹配,且没有一个更匹配的,调用的对象很模糊,这样就导致了编译错误。
当然如果输入的是max(1,20.0)那么将于第一种类型更加匹配,这样就不会导致编译错误。
注意:重载函数可以让程序更清晰并且更具有可读性。执行相同任务,但拥有不同类型的参数的函数应该使用相同的名字。
3、函数原型
在调用一个函数之前,必须在程序中声明它,就比如说我们之前写的程序,把所有需要用到的函数放在了主函数的前面,但是,这样可能会导致我们程序运行的主体不突出(主函数被埋没在最底下了),因此,我们可以使用函数原型的方式。
一个函数原型,就是一个没有函数体的一个单纯的函数声明,而将其函数体放在代码的最后,例如:
#include<iostream>
using namespace std;
int max(int n1,int n2); //注意这个分号
int main()
{
cout<<max(1,2);
return 0;
}
int max(int n1,int n2)
{
if(n1>n2)
return n1;
else
return n2;
}
4、缺省函数
关键点:可以为函数中的参数定义一个缺省值(即默认值)
例如:
#include<iostream>
using namespace std;
void pp(int i=0)
{
int x=i*i;
cout<<x<<endl;
}
int main()
{
pp();
pp(4);
return 0;
}
程序的输出如下:
0
16
这就是缺省函数的妙用,当没有给函数输入一个值时,则使用缺省值运行函数。
5、内联函数
关键点:常使用内联函数来提高函数性能
提到内联函数,就不得不提到函数的一个缺点:
使用函数来实现程序,固然可以使得代码更加整洁,更加具有可读性,但是同时,再调用函数时有额外的运行时开销(即将参数和CPU寄存器压入调用栈,以及在函数切换控制所花费的时间)
这样就有了内联函数。
内联函数不会被调用,实际上是编译器把其代码复制到了每一个调用点上。
为指定一个函数是内联函数,在函数声明之前加上关键字 inline 即可。例如:
#include<iostream>
using namespace std;
inline int max(int n1,int n2)
{
if(n1>n2)
return n1;
else
return n2;
}
int main()
{
int x,y,a;
cin>>x>>y;
a=max(x,y);
cout<<a;
return 0;
}
看起来似乎差不多,但这样会在函数多次运行时大大提高程序运行的速度。
看起来inline似乎很好,但这样仅仅是对于短函数而言的,因为如果函数较长,使用内联函数将会急剧的增加代码的长度,因为代码会被编译器复制到多个位置,故c++允许编译器对过长的函数忽略inline关键字。
因此,inline只是对编译器提出了一个请求,是否执行由编译器决定。