C++重载函数

C++重载函数C 允许在同一范围中声明几个功能类似的同名函数 但是这些同名函数的形式参数 指参数的个数 类型或者顺序 必须不同 即函数的参数列表不同 也就是说用同一个运算符完成不同的运算功能 这就是重载函数 重载函数常用来实现功能类似而所处理的数据类型不同的问题 函数重载有什么好处 重载函数通常用来命名一组功能相似的函数 这样做减少了函数名的数量 避免了名字空间的污染 对于程序的可读性有很大的好处 当

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
C++重载函数
  • 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
C++重载函数
  • 1
  • 2

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




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

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

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






#include 
     #include 
     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
C++重载函数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
#include 
     #include 
     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
C++重载函数
  • 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



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209018.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:14
下一篇 2026年3月19日 上午10:14


相关推荐

  • 海康SDK接口调用的主要流程

    海康SDK接口调用的主要流程SDK 接口调用的主要流程 初始化 SDK 功能 对整个网络 SDK 系统的初始化 内存预分派等操作 声明 BOOLNET DVR Init 返回值 TRUE 表示成功 FALSE 表示失败 接口返回失败请调用 NET DVR GetLastError 获取错误码 通过错误码判断出错原因 设置连接超时时间功能这部分为可选 用于设置 SDK 中的网络连接超时时间 用户可以根据

    2026年3月17日
    2
  • 数仓建模与分析建模_范式建模和维度建模

    数仓建模与分析建模_范式建模和维度建模数仓的建模或者分层,其实都是为了更好的去组织、管理、维护数据,所以当你站在更高的维度去看的话,所有的划分都是为了更好的管理。小到JVM内存区域的划分,JVM中堆空间的划分(年轻代、老年代、方法区等),大到国家的省市区的划分,无一例外的都是为了更好的组织管理方法论仅仅停留在理论层面上,落地实现的才真正决定了数仓设计的好坏,当然再好的方法,只有在合适的阶段使用,才有意义,才能发挥它最大的价值

    2026年3月2日
    4
  • 批量修改文件扩展名(批处理)

    批量修改文件扩展名(批处理)

    2021年11月17日
    48
  • SQL Browser_sqlitedatabase

    SQL Browser_sqlitedatabase在网上找一个SQLITE查看器这个查看器叫做:www.jb51.net/database/118822.html这个查看器可以新建SQLITE文件数据库,可以建立表索引,写SQL语句,编辑表数据不过这个查看器支持的SQLITE数据库引擎版本低了一点,先介绍一下SQLiteDatabaseBrowser2.0是怎么用的?主界面将SQLITE的db文件拖进去软…

    2025年10月13日
    4
  • JS打开新页面的两种方式:当前页面打开和新页面打开

    JS打开新页面的两种方式:当前页面打开和新页面打开在实际的开发过程中 经常会遇到需要刷新当前页面或者打开新页面的需求 根据具体情况我们会选择不同的打开方式 今天就简单记录一下两种方式的写法 1 点击某一个链接之后跳转到新页面显示 window open http www baidu com blank 2 需要刷新当前页面或者覆盖当前页面 window open http www baidu com sel

    2026年3月19日
    2
  • 经典遗传算法及MATLAB实例

    经典遗传算法及MATLAB实例经典遗传算法及简单实例 MATLAB 1 遗传算法简单介绍 1 1 理论基础 1 2 算法要点 1 1 编码 1 2 适应度函数 1 3 基本流程 2 雪兔实例 1 遗传算法简单介绍 1 1 理论基础整个算法的基础就是达尔文的生物进化论 物竞天择 适者生存 这句话已经是常识了 雪兔的故事 东北那旮瘩 有群原始雪兔 刚从未知物种进化而来 五颜六色 表现型 漂亮极了 称之为 I 0 注意 种群初始化 入夏了 雪兔们出来觅食 浅色兔在草地中无所遁形 被雪狐收割了一波 大批浅色 小批深色 入冬了 雪

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号