iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++函数重载怎么定义使用
  • 110
分享到

C++函数重载怎么定义使用

2023-06-30 06:06:52 110人浏览 泡泡鱼
摘要

这篇文章主要介绍了c++函数重载怎么定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载怎么定义使用文章都会有所收获,下面我们一起来看看吧。一、函数重载分析(上)1.1 重载的定义定义:同一个标

这篇文章主要介绍了c++函数重载怎么定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载怎么定义使用文章都会有所收获,下面我们一起来看看吧。

一、函数重载分析(上)

1.1 重载的定义

定义:同一个标识符在不同的上下文有不同的意义

1.2 函数重载的定义

  • 用同一个函数名定义不同的函数

  • 当函数名和不同的参数搭配时函数的含义不同

如下:

C++函数重载怎么定义使用

下面看一段代码,感受一下:

#include <stdio.h>#include <string.h>int func(int x){    return x;}int func(int a, int b){    return a + b;}int func(const char* s){    return strlen(s);}int main(int arGC, char *argv[]){    printf("%d\n", func(3));    printf("%d\n", func(4, 5));    printf("%d\n", func("D.T.Software"));    return 0;}

下面为输出结果:

C++函数重载怎么定义使用

1.3 函数重载需要满足的条件

函数重载至少满足下面的一个条件:

  • 参数个数不同

  • 参数类型不同

  • 参数顺序不同

下图所示就是参数的顺序不同:

C++函数重载怎么定义使用

下面看一个函数默认参数遇上函数重载的实例程序:

#include <stdio.h>int func(int a, int b, int c = 0){    return a * b * c;}int func(int a, int b){    return a + b;}int main(int argc, char *argv[]){    int c = func(1, 2);    return 0;}

下面为输出结果:

C++函数重载怎么定义使用

编译报错,因为模棱两可。如果说调用第一个函数说的过去,因为符合函数默认参数规则,c 的值已经确定;调用第二个函数也符合常理,所以编译不会通过。

1.4 编译器调用重载函数的准则

将所有同名函数作为候选者

尝试寻找可行的候选函数

  • 精确匹配实参

  • 通过默认参数能够匹配实参

  • 通过默认类型转换匹配实参

匹配失败

  • 最终寻找到的候选函数不唯一,则出现二义性,编译失败。

  • 无法匹配所有候选者,函数未定义,编译失败。

1.5 函数重载的注意事项

  • 重载函数在本质上是相互独立的不同函数

  • 重载函数的函数类型不同

  • 函数返回值不能作为函数重载的依据

函数重载是由函数名和参数列表决定的!!!

函数重载的本质是什么?下面通过一段代码深入分析,编译环境为VS2012。

#include "stdafx.h"#include <stdio.h>int add(int a, int b)  // int(int, int){    return a + b;}int add(int a, int b, int c) // int(int, int, int){    return a + b + c;}int main(){    printf("%p\n", (int(*)(int, int))add);    printf("%p\n", (int(*)(int, int, int))add);    return 0;}

C语言的知识可以知道,函数名就是函数的入口地址,所以输出结果如下:

C++函数重载怎么定义使用

可以看到,两个 add() 函数的入口地址不一样,所以这两个 add 是两个不同的函数。

编译器是如何看待这两个 add() 函数的呢?下面来深入分析。先看一下编译器产生的中间结果,在Test -> Debug -> Test.obj 文件中。

C++函数重载怎么定义使用

C++函数重载怎么定义使用

C++函数重载怎么定义使用

然后使用VS2012里面自带的命令行工具查看 Test.obj 里面有什么东西。

C++函数重载怎么定义使用

上图示为VS2012 命令行所在位置

输入 dumpbin,如下:

C++函数重载怎么定义使用

这里只需要关系 SYMBOLS(符号表),符号表就是编译器在编译过程中根据源代码所生成的一张表,这张表有程序的函数名变量等等。

输入以下命令,其中 /symbols 后面为 Test.obj 所在的位置。

C++函数重载怎么定义使用

找到下面的地方,可以看到编译器编译 (int __cdecl add(int,int)) 时标识符为?add@@YAHHH@Z;而编译器编译(int __cdecl add(int,int,int)) 时标识符为?add@@YAHHHH@Z ,也就是说编译器在编译这两个函数时已经把这两个函数分别对待,尽管它们名字一样,所以两个 add() 函数的入口地址不一样,这就很好理解了。

C++函数重载怎么定义使用

1.6 小结

  • 函数重载是 C++ 中引入的概念

  • 函数重载用于模拟自然语言中的词汇搭配

  • 函数重载使得 C++ 具有更丰富的语义表达能力

  • 函数重载的本质为相互独立的不同函数

  • C++ 中通过函数名和函数参数确定函数调用

二、函数重载分析(下)

2.1 函数重载遇上函数指针

将重载函数名赋值给函数指针时

  • 根据重载规则挑选与函数指针参数列表一致的候选者

  • 严格匹配候选者的函数类型与函数指针的函数类型

下面看一段代码:

#include <stdio.h>#include <string.h>int func(int x){    return x;}int func(int a, int b){    return a + b;}int func(const char* s){    return strlen(s);}typedef int(*PFUNC)(int a);int main(int argc, char *argv[]){    int c = 0;    PFUNC p = func;    c = p(1);       printf("c = %d\n", c);    return 0;}

下面为输出结果:

C++函数重载怎么定义使用

这也就是前面说的通过函数指针所指向的函数类型参数列表来进行选择。

注意事项

  • 函数重载必然发生在同一个作用域中

  • 编译器需要用参数列表或函数类型进行函数选择

  • 无法直接通过函数名得到重载函数的入口地址(可以通过指针来获取)

如下,这段代码想通过函数名获取重载函数的入口地址:

#include <stdio.h>int add(int a, int b)  // int(int, int){    return a + b;}int add(int a, int b, int c) // int(int, int, int){    return a + b + c;}int main(){    printf("%p\n", add);    printf("%p\n", add);    return 0;}

编译的时候会报错,无法确定是哪个函数。

C++函数重载怎么定义使用

2.2 C++和C的相互调用

  • 实际工程中C++和C代码相互调用是不可避免的

  • C++编译器能够兼容C语言的编译方式

  • C++编译器会优先使用C++编译的方式

  • extern 关键字能强制让C++编译器进行C方式的编译

如下:

C++函数重载怎么定义使用

linux环境下新建一个 9-2 文件夹,先在文件夹下新建 add.c 和 add.h 文件,如下:

add.c :

#include "add.h"int add(int a, int b){    return a + b;}

add.h :

int add(int a, int b);

通过 linux 命令 cd 进入 9-2 文件夹,再将 add.c 转换成 add.o 文件,如下所示:

C++函数重载怎么定义使用

然后在 9-2 文件夹下建一个 main.cpp 文件,如下:

C++函数重载怎么定义使用

mian.cpp :

#include <stdio.h>#include "add.h"int main(){    int c = add(1,2);    printf("c = %d\n", c);    return 0;}

对程序进行编译,发现程序报错,没有定义 add() 函数,但是函数确实已经定义了,可以使用 linux 中的 nm 指令查看 add.o 里面的信息,打印出来的就是符号表信息,可以看到确实有 add 。

C++函数重载怎么定义使用

这个时候就需要使用 extern关键字强制让C++编译器进行C方式的编译,所以 main.cpp就要修改成这样:

#include <stdio.h>extern "C"{  #include "add.h"  }int main(){    int c = add(1,2);    printf("c = %d\n", c);    return 0;}

这样编译就能通过了:

C++函数重载怎么定义使用

如果在 9-2 文件中新建一个 main.c 文件,main.c 里面的代码 与 main.cpp 中的相同。

C++函数重载怎么定义使用

进行编译,发现会报错误,因为 extern 关键词写法是 C++ 中的, C语言不支持该写法。那有没有一种写法既能被 C语言编译通过,又能让 C++编译通过呢?且看下面。

2.3 使得C代码只会以C的方式被编译的解决方案

  • _cplusplus 是C++编译器内置的标准宏定义

  • _cplusplus 的意义是确保C代码以统一的C方式被编译成目标文件

如下:

C++函数重载怎么定义使用

所以上述代码可以写作,main.c和 main.cpp 均为:

#include <stdio.h>#ifdef __cplusplusextern "C" {#endif#include "add.h"#ifdef __cplusplus}#endifint main(){    int c = add(1, 2);    printf("c = %d\n", c);    return 0;}

这样程序在 C语言和 C++ 的编译环境下均能通过,如下:

C++函数重载怎么定义使用

注意事项

C++编译器不能以C的方式编译重载函数

编译方式决定函数名被编译后的目标名

  • C++编译方式将函数名和参数列表编译成目标名

  • C 编译方式只将函数名作为目标名进行编译

下面通过一个例子说明一下:

int add(int a, int b)  // int(int, int){    return a + b;}int add(int a, int b, int c) // int(int, int, int){    return a + b + c;}

将该代码编译成目标文件,取名为 test.oo,然后通过 linux 中的 nm 命令查看 test.oo 中的东西,可以看到 test 符号表里面有两个东西 T _Z3addii 和T _Z3addiii,这就是 add 函数被编译过后的目标函数名,ii 表示两个参数, iii 表示三个参数。

C++函数重载怎么定义使用

如果采用 C 方式编译重载函数,代码如下:

extern "C"{    int add(int a, int b)  // ==>add    {        return a + b;    }    int add(int a, int b, int c) // ==>add    {        return a + b + c;    }}

下面为编译结果,可以看到编译报错,说两个 add() 函数冲突了。

C++函数重载怎么定义使用

关于“C++函数重载怎么定义使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++函数重载怎么定义使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++函数重载怎么定义使用

本文链接: https://www.lsjlt.com/news/327685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++函数重载怎么定义使用
    这篇文章主要介绍了C++函数重载怎么定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载怎么定义使用文章都会有所收获,下面我们一起来看看吧。一、函数重载分析(上)1.1 重载的定义定义:同一个标...
    99+
    2023-06-30
  • C++中函数重载定义与原因是什么
    小编给大家分享一下C++中函数重载定义与原因是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引例如果要求你只能通过print函数,即能打印字符串,又能打印一个整型。虽然在C语言中我们可以通过 print_i 和prin...
    99+
    2023-06-29
  • C++函数重载的定义与原因详解
    目录引例函数重载的定义函数重载规则为什么C不支持函数重载而C++可以内部名称总结引例 如果要求你只能通过print函数,即能打印字符串,又能打印一个整型。 虽然在C语言中我们可以通过...
    99+
    2024-04-02
  • 怎么使用C++函数类型与重载函数
    本篇内容介绍了“怎么使用C++函数类型与重载函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.首先对重载函数,明确函数的返回类型不能决定...
    99+
    2023-06-25
  • C++重载的奥义之函数重载详解
    目录一、基本定义        二、应用举例        三、非函数重载的情况四、函数重载的使用原则...
    99+
    2023-05-16
    C++ 函数重载 C++ 函数 C++ 重载
  • C#重载运算符怎么定义
    本文小编为大家详细介绍“C#重载运算符怎么定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#重载运算符怎么定义”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C# 运算符重载您可以重定义或重载 C#...
    99+
    2023-06-17
  • C++友元函数怎么定义和使用
    C++友元函数是指一个非成员函数可以访问类的私有成员和保护成员。以下是定义和使用C++友元函数的步骤:1. 在类的声明中声明友元函数...
    99+
    2023-10-11
    C++
  • Java重写,重载,多态怎么定义使用
    本篇内容主要讲解“Java重写,重载,多态怎么定义使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java重写,重载,多态怎么定义使用”吧! 1.重写: ...
    99+
    2024-04-02
  • C++缺省参数与函数重载怎么使用
    这篇文章主要介绍了C++缺省参数与函数重载怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++缺省参数与函数重载怎么使用文章都会有所收获,下面我们一起来看看吧。一、缺省参数缺省参数形象来说就是"...
    99+
    2023-07-02
  • C语言的函数怎么定义和使用
    本篇内容主要讲解“C语言的函数怎么定义和使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的函数怎么定义和使用”吧!关于函数函数是C语言的基本单元,函数中包含实现程序功能的代码。C语言程序...
    99+
    2023-06-30
  • 为什么需要使用 C++ 函数重载?
    c++++ 函数重载允许在同一个命名空间中创建多个具有相同名称但参数不同的函数,提供编写特定函数实现的灵活性,从而提高代码可读性、代码复用性、错误处理能力和性能。 为什么使用 C++ ...
    99+
    2024-04-26
    c++ 函数重载 代码可读性
  • C++之重载 重定义与重写用法详解
    目录一、重载(重载函数)1、代码实现在一个类中fun()函数的重载:2、运行程序之后的打印二、重定义(函数同名隐藏)1、代码实现在两个类中分别定义一个函数(函数名要求相同):2、运行...
    99+
    2024-04-02
  • c++怎么自己定义函数
    通过使用 function 关键字,可以创建自定义函数,包括指定返回类型、命名函数、定义参数列表、编写函数体和返回一个值(对于非 void 函数)。示例代码演示了如何计算两个数的和并返回...
    99+
    2024-04-22
    c++
  • 如何使用C++获取指定的重载函数地址
    刚刚看到一篇博客,说 std::bind 无法绑定正确的重载函数。这里的问题并不是 std::bind 能力不足,而是将函数名传递给 std::bind 时编译器无法取到这个函数的地...
    99+
    2024-04-02
  • JavaScript函数怎么定义和使用
    本文小编为大家详细介绍“JavaScript函数怎么定义和使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript函数怎么定义和使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.用函数语句定义...
    99+
    2023-07-02
  • c++函数的重载怎么实现
    这篇文章主要讲解了“c++函数的重载怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++函数的重载怎么实现”吧!1.函数重载概述作用:函数可以相同,提高复用性函数重载必须满足的条件:...
    99+
    2023-06-29
  • C语言函数有哪些及怎么定义使用
    本篇内容介绍了“C语言函数有哪些及怎么定义使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、函数是什么?维基百科中对函数的定义:子程序在...
    99+
    2023-06-30
  • C++中怎么进行函数重载
    今天就跟大家聊聊有关C++中怎么进行函数重载,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数重载要求编译器能够***地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定...
    99+
    2023-06-17
  • C++ 函数重载中重载函数的规则是什么?
    c++++ 重载函数的规则如下:1. 参数列表不同(数量、类型或顺序);2. 参数数量必须不同;3. 参数类型不同;4. 参数顺序不同;5. const 和引用限定符不影响重载。 C+...
    99+
    2024-04-14
    c++ 函数重载
  • C/C++语言中函数重载功能怎么用
    小编给大家分享一下C/C++语言中函数重载功能怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!“函数重载”指的是可以有多个同名的函数,因此 名称进行了重载。这...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作