第8课 函数重载分析(上)

重载(Overload):

C++中的函数重载:

函数重载示例:

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 int func(int x)
 5 {
 6     return x;
 7 }
 8
 9 int func(int a, int b)
10 {
11     return a + b;
12 }
13
14 int func(const char* s)
15 {
16     return strlen(s);
17 }
18
19
20 int main(int argc, char *argv[])
21 {
22     printf("%d\n", func(3));
23     printf("%d\n", func(4, 5));
24     printf("%d\n", func("D.T.Software"));
25
26     return 0;
27 }

运行结果如下:

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

上面的两个函数满足参数顺序不同,所以是可以构成重载函数的。

当函数默认参数遇上函数重载会发生什么?如下:

用g++编译上述程序,结果如下:

如果在main函数中不调用这个func函数的话,则编译器不会报错,因为,这两个函数确实构成了重载关系。但是如果在main函数中调用了func,则编译器不知道具体该调用哪一个函数,所以会报错。

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

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

  尝试寻找可行的候选函数  

    1、精确匹配实参

    2、通过默认参数能够匹配实参

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

  匹配失败

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

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

函数重载的注意事项:

重载本质:

 1 #include <stdio.h>
 2
 3 int add(int a, int b)  // int(int, int)
 4 {
 5     return a + b;
 6 }
 7
 8 int add(int a, int b, int c) // int(int, int, int)
 9 {
10     return a + b + c;
11 }
12
13 int main()
14 {
15     printf("%p\n", (int(*)(int, int))add);
16     printf("%p\n", (int(*)(int, int, int))add);
17
18     return 0;
19 }

在VS2010上的运行结果如下:

可见,两个函数的入口地址不同,因此,它们是不同的函数。

我们查看一下生成的中间文件test.obj,在VS2010自带的命令行工具下,输入dumpbin  /symbols test.obj,输出结果如下:

我们看到00c和015这两项分别就是两个func函数对应的项,两个函数编译过后的标识符如下:

这两个标识符是不一样的,C++编译器就是通过这种方式区别重载函数的。

小结:

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

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

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

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

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

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9521058.html

时间: 2024-07-29 15:21:06

第8课 函数重载分析(上)的相关文章

第9课 函数重载分析(下)

1. 重载与函数指针 (1)将重载函数名赋值给函数指针时 ①根据重载规则挑选与函数指针参数列表一致的候选者 ②严格匹配候选者的函数类型与函数指针的函数类型(所谓严格匹配,即函数参数及返回值都匹配) [编程实验]函数重载 VS 函数指针 #include <stdio.h> #include <string.h> int func(int x) { return x; } int func(int a, int b) { return a + b; } int func(const

第9课 - 函数定义及调用

第9课 - 函数定义及调用 1. makefile中的函数 (1)make 解释器提供了一系列的函数供 makefile 调用 (2)在 makefile 中支持自定义函数实现,并调用执行 (3)通过 define 关键字实现自定义函数 2. 在makefile中自定义函数 (1)自定义函数的语法 其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参 (2)深入理解自定义函数 - 自定义函数是一个多行变量,无法直接调用 - 自定义函数是一种过

第七课 函数的嵌套调用【项目1-4】

第七课 函数的嵌套调用 项目一[k次方之和] 设计程序,计算: 请在下面的程序结构基础上完成设计. [cpp] view plain copy print? #include<stdio.h> int power(int m,int n); //求m的n次方(m^n) int sum_of_power(int k,int n);  //从1^k到n^k的累加和 int main( ) { int k, n; scanf("%d %d", &k, &n); p

第六课 GDB调试 (上)

序言: 初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办呢,这个时候就要调试了.说到调试有经验的开发童鞋知道在windows下游大名鼎鼎的VS集成平台,那么在linux下呢,特别是编写C.C++有什么工具可以方便我们调试呢,这里我给大家推荐的就是GDB,它也是GNU的debugger,专门为调试而生的. 知识点: gdb的大致分为以下功能: 1.启动程序: 2

C语言-第36课 - 函数递归与函数设计技巧

第36课 - 函数递归与函数设计技巧 一. 递归 递归概述 (1) 递归是数学领域中的概念在程序设计中的应用. (2) 递归是一种强有力的程序设计的方法. (3) 递归的本质为函数内部在适当的时候调用自身. 组成部分 (1)递归点:以不同参数调用自身. (2)出口:不在递归调用 下面就是求一个数的阶乘的函数: #include <stdio.h> int func(int x) { if( x > 1 ) { return x * func(x - 1);  //递归点 } else {

【黑马程序员】第12课:文件上传&文件下载&注解

<pre> day12 上节内容回顾 1.jstl的标签 *if  choose *forEach <c:forEachvar="l" items="${list}"> 2.jsp开发模式 *模型一 *模型二(mvc模式) **mvc模式 ***m:模型,使用javabean ***v:视图,使用jsp ***c:控制器,使用servlet *dao模式:数据访问对象,专注于对数据库的操作 **首先创建接口,在接口里面定义操作数据库的方法 *

学习软件工程课的心得上

一开始看到软件工程的课本的时候,我看了一下,书名为<软件工程--理论.方法与实践>,我本来以为这将会是大三这一学期相对轻松的课程. 没有想到,第一节课,老师的PPT上对软件工程课的吐槽让我惊呆了,我想,到底该怎么办啊?是不是这一学期会被这门课给烦死给累死啊.然后不出所料的,不久之后老师就布置了第一个编程的作业,其实我的编程特别的差劲,但是既然布置了作业,没有办法,只能硬着头皮做下去,其实不得不承认,当时心里其实是有一些怨念的,但是没有别的法子,只能上网搜,然后一点点的看,查,最后终于弄懂了算法

C和指针 (pointers on C)——第七章:函数(上)

第七章 函数 这一章对于有一定C的基础的人有一定优秀代码风格的人来说,并不是很虐.关于stdarg宏可能有些陌生,它负责可变参数列表的定义. 总结: 新式风格和旧式风格就不要提了.八百年前的事情. 函数常见的是把原型放在一个单独的文件里,当其他文件需要这个原型时,就用#include指令把这个文件包含进来,这个技巧可以使原型必需的拷贝份数降低到最低,有助于提高程序的可维护性. return语句用于指定从一个函数返回的值,如果没有返回值,为void. 函数的参数是通过传值的方式进行转换,实际传递的

白话空间统计十五:多距离空间聚类分析 (Ripley&#39;s K 函数) (上)

空间分析里面,最重要的一个概念就是距离,不同的距离会导致不同的结果.在研究的时候,有种叫做"空间尺度"的概念,这个有兴趣的话,请自行百度(老规矩:百度知道的东西别问我). 所以,在研究聚类的时候,最重要的就是确定不同数据之间的距离,否则就会如下: 聚类分析中,要素之间的距离是个很重要的参数:也就是说两个要素相隔多远才算是聚成一类呢?在任何一种聚类算法中,探索一个合适的距离,都是比较纠结的事情.专家提出了各种算法,都想要优化这个距离探索的过程,以便有效的降低计算开销. 同样一份数据,在不