博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++函数的重载、内联和默认参数
阅读量:4286 次
发布时间:2019-05-27

本文共 2472 字,大约阅读时间需要 8 分钟。

函数重载

在C++中,如果需要定义几个功能相似,而参数类型不同的函数,那么这样的几个函数可以使用相同的函数名,这就是“
函数重载
”。


例如,求和函数,对应不同的参数类型,可以定义如下几个重载函数:

    sum(int a,int b) //不写返回类型,返回整型

    double sum(double a,double b)

    float sum(floata,float b,float c)

以下语句中是不同的调用:

    int x=sum(2,8);

    float y=sum(5.6,11.1);

    float z=sum(float(x),y,5);


当调用到重载函数时,编译器根据实参的类型对应地调用相应的函数。匹配过程按如下步骤进行:

(1)如果有参数严格匹配(参数个数、类型完全一致)的函数,就调用该函数;
(2)参数通过内部类型转换后匹配,调用该函数;
(3)参数通过用户定义的类型转换寻求匹配。


在定义重载函数时必须保证参数个数或类型不同,仅仅返回值类型不同是不行的。


函数重载的好处是:可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。


举例:【例3.16】重载函数的应用。

#include<iostream>

using namespace std;

int sum(int a,int b){

    return a+b;               

}

double sum(double a,double b){

    return a+b;

}

float sum(float a,float b,float c){

    return a+b+c;

}

int main(){

    cout<<"3+5="<<sum(3,5)<<endl;       //调用sum(int,int)

    cout<<"2.2+5.6="<<sum(2.2,5.6)<<endl;  //调用double(double,double)

    cout<<"3.5+4+8="<<sum(3.5,4,8)<<endl;  //调用float sum(float,float,float)

    return 0;

}

默认参数

一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同。“
默认参数
”指在定义或声明函数时为形参指定默认值(default)。这样的函数在调用时,对于默认参数,可以给出实参值,也可以不给出实参值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按默认值进行调用。


举例:【例3.17】 默认参数的应用。(

#include<iostream>

using namespace std;

void delay(int loops=1000){        //延时函数,默认延时1000个时间单位

    for (; loops>0; loops--);

}

int main(){

    delay(100);

    cout<<"延时100个时间单位"<<endl;

    delay();                            //等同于delay(1000)

    cout<<"延时1000个时间单位"<<endl;

    return 0;

}


几点注意:
  • 默认参数并不一定是常量表达式,可以是任意表达式,则函数每次被调用时该表达式被重新求值,但表达式必须有意义。例如:
        int fun1(a=rand());
        //调用时若省略参数a,即fun1();可由随机数发生函数当场产生,编译时确定调什么函数。
  • 默认参数还可以是全局常量、全局变量,甚至可以通过函数调用给出;但不能通过局部变量给出,因为局部变量的值在执行时才有意义。
  • 默认参数还可以有多个,但所有默认参数必须放在参数表的右侧,即先定义所有的非默认参数,再定义默认参数。例如: int sum(int a,int b=100,int c=200);这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。
  • 在同一个作用域中一个参数只能被指定一次默认值,不可以在声明和定义中同时指定默认值,即使默认值一样也不行。例如:
        int fun2 (int, int =10, int =20); //函数原型中给出缺省值,参数名也可省略
        void fun1()
        {…}
        int fun2(int a, int b, int c)
        {…}//定义中不再给出缺省值
  • 习惯上,默认参数在公共头文件包含的函数声明中指定,否则默认实参只能用于包含该函数定义的文件中的函数调用。
  • 在不同作用域或嵌套作用域中可以重新声明默认参数,但不提倡。在嵌套作用域中声明一个名字去屏蔽在外层作用域的同一名字的声明,尤其容易出错。

内联函数

  • 当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。
  • 有些情况下,函数本身功能简单,代码很短,但使用频率却很高,程序频繁调用该函数所花费的时间却很多,从而使得程序执行效率降低。
  • 为了提高效率,一个解决办法就是不使用函数,直接将函数的代码嵌入到程序中。但这个办法也有缺点,一是相同代码重复书写,二是程序可读性往往没有使用函数的好。
  • 为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。

举例: 请看如下程序段,读入一行字符串,逐个判断是否为数字字符:

# include <iostream.h>

inline IsNumber(char ch) { //因使用频度很高,说明为内联函数

    return ch>=′0′&&ch<=′9′?1:0;

}

void main(){

    char ch;

    while(ch=cin.get(ch)!= ′\n′){

        if (IsNumber(ch)) cout<<″是数字字符 ″<<endl;//内联函数的调用不特殊

        else cout<<″不是数字字符 ″<<endl;

    }

}

转载地址:http://xvxgi.baihongyu.com/

你可能感兴趣的文章
iOS中判断是否首次下载app
查看>>
iOS 沙盒机制,沙盒存储,钥匙串
查看>>
iOS设备唯一标识保存、钥匙串
查看>>
iOS判断网络
查看>>
iOS需要学习和解决的若干问题-----------------
查看>>
iOS 十进制转换成十六进制
查看>>
PHP 基础五
查看>>
PHP基础六 数组
查看>>
iOS 判断手机上是否装了某款软件
查看>>
PHP 数据库mysql(一)命令行操作数据库
查看>>
iOS CLRegion监听区域
查看>>
iOS之UIApplecation和appdelegate的使用
查看>>
iOS中app设计、自动登录的设计
查看>>
PHP数据库mysql(二)增删改查
查看>>
javascript(一)
查看>>
javascript(二)之HTMLDOM
查看>>
javascript(三)之对象
查看>>
javascript(四)之window
查看>>
javascript(五)之框架
查看>>
WKWebView 和UIWebView、网页缓存、网路请求缓存
查看>>