C++ 函数重载的概念

在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如把变量的值写入文件,变量的类型int、long、double、char,需要通过参数把变量传入函数。在C语言中不允许函数同名,程序员只能设计出四个不同名的函数,其函数原型与下面类似:

bool writetofile_int(char *filename,int value);  // 写入int

bool writetofile_long(char *filename,long value);  // 写入long

bool writetofile_double(char *filename,double value); // 写入double

bool writetofile_char(char *filename,char *value); // 写入char字符串

C中独一无二函数名的限定对函数的使用者和作者都是一种负担。作者需要想象出相近但差异又不能太大的函数名,而使用者需要学会这些不同。一个认真的作者会浪费数小时来设计一组函数名前缀或后缀,以便减少使用者的负担。

但在C++中,这完全没有必要。C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,多个功能相近但差异又不能太大的一系列函数可以使用同一函数名。

函数的参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。

使用C++的函数重载,把变量的值写入文件的函数声明修改如下:

bool writetofile(char *filename,int value);     // 写入int

bool writetofile(char *filename,long value);   // 写入long

bool writetofile(char *filename,double value); // 写入double

bool writetofile(char *filename,char *value);   // 写入char字符串

通过以上的示例可以发现,重载就是在一个作用范围内(同一个程序、同一个类、同一个命名空间等)有多个名称相同但参数不同的函数。

在使用重载函数时,同名函数的功能应当相似,不要用相同名称的函数名去实现不相干的功能,虽然程序也能运行,但可读性不好,使人觉得莫名其妙。

注意,参数列表不同包括参数的个数不同、类型不同或顺序不同,仅仅参数名称不同是不可以的,函数返回值也不能作为重载的依据。

函数的重载的规则:

1)函数名称必须相同。

2)参数列表必须不同。

C++ 是如何做到函数重载的

C++代码在编译时会根据参数列表对函数进行重命名,例如:

bool writetofile(char *filename,int value);

重命名为

bool _writetofile_char_int(char *filename,int value);

bool writetofile(char *filename,long value);

重命名为

bool _writetofile_char_long(char *filename,long value);

函数被调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。

不同的编译器有不同的重命名方式,这里仅仅举例说明,实际情况可能并非如此。

从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。

函数重载的示例

我们在介绍C语言字符串的时候,学习了strcpy函数。

char *strcpy(char *dest, const char *src);

strcpy函数有两个缺陷:1)没有对dest变量进行初始化;2)如果src的长度超过dest,会造成内存溢出。

我们现在来重写strcpy函数,弥补这两个缺陷,新函数名还是采用strcpy命名,但参数不同,声明如下:

char *strcpy(char *dest, const char *src,size_t destlen);

dest和src参数的含义与库函数strcpy相同,第三个参数destlen表示dest的长度,即声明时数组的大小。

示例(book201.cpp)

运行结果

C语言提供了一些库函数,这些库函数的功能往往不能满足实际开发的需求,需要程序员重新扩展加固,这也是高水平程序员与普通程序员的差别之一。

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net)

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

C++语言函数重载详解和示例相关推荐

  1. C++中的函数重载详解(名字粉碎技术)

    目录 一.什么是函数重载? 二.函数重载的规则 1.编译器的工作 2.函数重载的原理 2.判断函数重载的依据 一.什么是函数重载? 函数重载简介:在C++中,可以为两个或两个以上的函数提供相同的函数名 ...

  2. Hive中row_number()函数用法详解及示例

    目录 一.Hive 中row_number()函数介绍 二.使用示例 三.总结 四.附录 在Oracle中,我们经常会用到row_number() over(partition by clo1 ord ...

  3. C++语言类的详解和示例

    超女选秀的例子我们玩了很久,为了教学的需要,暂时离开美眉们,我将采用实际项目开发的例子. 在C语言基础知识中已学习过文件操作,在实际开发中,我会把文件操作封装成一个类,类的声明如下: 类的声明和成员函 ...

  4. C语言---函数介绍详解

    生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识--左拉 文章目录 前言 函数 模块化程序设计方法 函数的定义 函数的分类 函数定义角度 库函数 自定义函数 函数形式角度 无参函数 ...

  5. 七、C语言函数定义详解

    文章目录 1.函数的声明和定义 2.函数的调用 3.函数参数的两种传递方式 1.传值调用(C语言默认传递参数方式) 2.引用调用 4.函数的分类 1.内部函数(静态函数) 2.外部函数 1.函数的声明 ...

  6. 计算机科学类专升本复习之“C语言函数定义”详解(初稿)

    今天首先要讲的是C语言的无参函数定义 函数 如果不接收"用户传递"的数据,那么定义时可以不带参数 例如: dataType kangkang(){ //nb } dataType: ...

  7. 【C语言函数参数详解】——实际参数(实参)形式参数(形参)

    文章目录 一.什么是实际参数(实参) 二.什么是形式参数(形参) 三.形参与实参的关系 这篇文章我们一起学习一下函数的参数,函数的参数分为实参和形参. 一.什么是实际参数(实参) 首先我们来学习实参, ...

  8. c语言fputc输入字符串,C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    C语言fgetc和fputc函数用法详解(以字符形式读写文件),文件,字符,指针,函数,字节 C语言fgetc和fputc函数用法详解(以字符形式读写文件) 易采站长站,站长之家为您整理了C语言fge ...

  9. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

最新文章

  1. 365个机器学习概念,“耐撕”的AI日历限量预售 | 新年礼物嗷~
  2. Chapter 3 Phenomenon——23
  3. Firefox关闭最后一个标签页时不关闭Firefox的设置
  4. python编程狮app题库_‎Python编程狮-零基础学Python App Storessa
  5. flask 允许内网访问
  6. Wireshark 过滤器
  7. MT7628学习笔记(13)——ipk软件包编写与应用
  8. 谷歌google搜索打不开、谷歌gmail邮箱及相关服务无法登录的解决的方法
  9. 如何定制下载SMAP产品
  10. Predictive State Temporal Difference Learning 原文翻译预测状态时间差分学习
  11. cocoscreator 使用内置自带的资源和生成单色图片
  12. mac 更新hosts文件使其生效
  13. 反反复复就是原地踏步
  14. IIS发生意外错误0x8ffe2740 IIS不…
  15. 利用多种语言打印出:第一行一个*,第二行两个*,依次类推
  16. java杂谈(瞎吉尔找的练习)
  17. html 输入框联动显示,js下拉选择框与输入框联动实现添加选中值到输入框的方法...
  18. web前端——h标签
  19. Go语言圣经的知识图谱
  20. realmeQ3 Pro狂欢版和GT Neo闪速版有什么区别

热门文章

  1. Python+pandas你可能不知道的排序技巧
  2. 使用Python操作PowerPoint文件中的表格
  3. Python+pickle读写二进制文件小案例
  4. 计算机不能代替人类英语作文,2013年雅思写作范文:电脑翻译能取代人吗?
  5. python设计模式六大原则_学习设计模式 - 六大基本原则之迪米特法则(示例代码)...
  6. 八段锦八个动作名称_八段锦工间操“动”起来 全民健身精气神“燃”起来
  7. 非现场执法管理计算机(工业级),浅析非现场执法中存在问题的方法及对策
  8. python画图为什么运行不出来_PyCharm中Matplotlib绘图不能显示UI效果的问题解决
  9. java php json转字符串_php json字符串转为数组或对象
  10. cupsd进程_linux pstree命令显示正在运行的进程的进程树状图