C++重载函数

C/C++ 专栏收录该内容
5 篇文章 0 订阅


C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,即函数的参数列表不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

函数重载有什么好处?
重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。当函数的编写者充分考虑了不同情况下应该运行稍有不同的函数,函数的使用者就不必为这些小细节而烦恼了。
类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!

例:
void print(int a)
{
    printf("void print(int a)\n");
}

void print(string a) //参数类型不一样
{
printf("void print(string a)\n");
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上面两个就是重载的函数。调用函数时,通过对参数的识别从而调用不同的重载函数。例如在main函数中,如果给的参数是int,那么就会调用上面的那个重载函数,如果给的参数是string,那么就会调用下面的重载函数。

此外,参数个数和顺序不同也能构成不同的重载函数。例:

void print(int a ,string b); //参数个数不同
void print(string a ,int b);//参数顺序不同
 
  • 1
  • 2
  • 1
  • 2

所以,构成函数重载的条件如下:
1、函数名相同。
2、这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,即参数列表不同。

需要注意的是,返回值类型不同不构成重载函数。例:

char print(int a ,string b ,string b);
double print(double a);
//这两个函数和以上的print函数都不是重载函数
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

重载函数的匹配原则:
1、严格匹配,找到后就调用。
2、没有找到严格匹配的函数,但是可以通过隐式转化,找到适合的重载函数。
例:

#include<iostream>
#include<stdio.h>
using namespace std;
void count(int a)   //参数类型为int
{
    cout << "void count(int a)" << endl;
}
void count(string a)//参数类型
{
    cout << "void count(string a)" << endl;
}
int main()
{
    double min = 0.5;
    count(min); //实参为double类型
    getchar();
    return 0;
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

通过隐式转换可以将double转为int,然后调用参数类型为int 的函数。
但是要注意一个问题,就是隐式转换的规则
而且要注意int到long和double,double到int和float的隐式转换,会引发二义性(ambiguous)。就是有两个都可行的选择,计算机无法替你做选择。(计算机也有选择困难症啊。。。。)例:

#include<iostream>
#include<stdio.h>
using namespace std;
void count(double a)//形参类型为double
{
    cout << "void count(double a)" << endl;
}
void count(long b)//形参类型为long
{
    cout << "void count(long b)" << endl;
}
int main()
{
    int min = 10;
    count(min);//实参类型为int
    getchar();
    return 0;
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

此时无法通过编译。显示 error C2668: “count”: 对重载函数的调用不明确。即,ambiguous。

下面简单说说函数重载的原理
C++采用命名倾轧(name mangling)的技术来改变同名函数,以区分参数不同的函数。
例:
void name(char a);通过倾轧->变成类似于void name_c;的形式。
void name(string a);通过倾轧->变成类似于void name_s;的形式。
void name(char a, int b);通过倾轧->变成类似于void name_ci;的形式。

name mangling 发生在两个阶段,一个是.cpp编译时,一个是.h的声明阶段。只有两个阶段同时进行才能匹配上。也就是要同时改名才可以。

具体的可参照其他大神博客:


http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html

  • 8
    点赞
  • 0
    评论
  • 31
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值