c++函数基础知识点

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只是对编译器提出了一个请求,是否执行由编译器决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值