1,重载是 C 语言到 C++ 语言的一个飞跃,C 语言中没有重载的概念,所有的函数 名是不允许有重复的,在 C++ 中因为引进了重载,所以函数名可以重复;

2,自然语言中的上下文:

1,你知道上面词汇中“洗”字的含义吗?

1,不同的动词和名次搭配的含义是不同的;

2,结论:

1,能和“洗”字搭配的词汇有很多;

2,“洗”字和不同的词汇搭配有不同的含义;

3,重载(Overload)的概念:

1,重载是同一个标识符在不同的上下文有不同的意义;

2,如:

1,“洗”和不同的词汇搭配后有不同的含义;

1,洗衣服,洗脸,洗脑,洗马桶,...;

2,“play”和不同的单词搭配后有不同的含义;

1,play chess, play piano, play basketball, ...;

4,思考:

1,重载在自然语言中是随处可见的,那么程序设计中是否也有重载呢?

1,让程序设计语言接近自然语言,所以计算机科学家在设计语言的时候就考虑将人类的语言习惯引进到程序设计语言中,C++ 就引入了重载的概念;

2,程序设计语言中和动词接近的是函数,所以 C++ 中选择函数来实现重载的概念;

5,C++ 中的函数重载:

1,函数重载(Function Overload):

1,用同一个函数名定义不同的函数;

1,这是 C++ 中重载的概念;

2,C++ 后续语言也是这样实现重载;

2,当函数名和不同的参数搭配时函数的含义不同;

1,当函数名和不同的参数搭配时实现了函数重载;

1,函数名类似动词,参数类似名词;

2,含义的不同在于所执行的函数体不同;

3,代码示例:

 int func(int x)
{
return x;
} int func(int a, int b)
{
return a + b;
} int func(const char* s)
{
return strlen(s);
}

2,函数重载初探编程实验:

1,main.cpp 文件:

 #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());
printf("%d\n", func(, ));
printf("%d\n", func("D.T.Software")); return ;
}

2,输出结果:

3

9

12.

3,C++ 支持函数重载,它是根据自然语言中的重载概念得来的;

6,函数重载至少满足下面一个条件(数类序):

1,参数个数不同;

2,参数类型不同;

3,参数顺序不同;

7,当函数默认参数遇上函数重载会发生什么?

1,代码示例:

 int func(int a, int b, int c = )
{
return a * b * c;
} int func(int a, int b) // 个数不同,构成重载;
{
return a + b;
} int main()
{
int c = func(, ); // which one? return ;
}

8,函数默认参数 VS 函数重载编程实验:

1,main.cpp 文件:

 #include <stdio.h>

 int func(int a, int b, int c = )
{
return a * b * c;
} int func(int a, int b)
{
return a + b;
} int main(int argc, char *argv[])
{
int c = func(, ); // error: call of overloaded 'func(int, int)' is ambiguous return ;
}

2,这里是 C++ 中第一个特性冲突,后续 Java、C# 语言上述的默认参数值是不允许的,因为程序设计时,不允许二义性;

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

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

2,尝试寻找可行的候选函数;

1,精确匹配实参;

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

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

3,匹配失败:

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

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

10,函数重载的注意事项:

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

2,重载函数的函数类型不同;

3,函数返回值不能作为重载的依据;

1,函数重载是由函数名和参数列表决定的;

11,函数重载的本质编程实验:

1,main.cpp 文件:

 #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);//函数名 add 是函数入口地址,当只用add来得到地址时,由于重载的原因,编译器在此处显示 error: overloaded function with no contextual information,而当不是重载的函数时,可以直接使用 add 来获取函数地址;这里通过强制类型转换将 add 转换为 (int(*)(int, int)) 这样的函数指针;
printf("%p\n", (int(*)(int, int, int))add); return ;
}

2,输出结果:

  00DF100A

  00DF100F

3,结论 1:

  1,函数的入口地址不同,可以反向的证明这是两个不同的函数;

4,通过 VS 命令行运行命令“dumpbin /symbols ProgramName.obj路径”查看 VS 中的工程符号表中的如下两行:

  00E 00000000 SECT3  notype ()    External     | ?add@@YAHHH@Z (int __cdecl add(int,int))

   1,C++ 编译器编译 int __cdecl add(int,int) 函数后,在符号表中认为标识符为 ?add@@YAHHH@Z;

  01F 00000000 SECT7  notype ()    External     | ?add@@YAHHHH@Z     (int __cdecl add(int,int,int))

  1,C++ 编译器编译 int __cdecl add(int,int,int) 函数后,在符号表中认为标识符为 ?add@@YAHHHH@Z;

5,结论 2:

  1,编译器在编译这两个函数的时候,已经分开对待了,编译器获得的这两个函数的名字是不同的;

  2,编译器认为这是两个不同的函数,所以编译出的最终结果也就是可执行程序中这两个函数的入口地址是不同的;

6,总的结论:

  1,不管正向推还是反向推,C++ 语言中重载函数的本质其实是不同的函数;

12,小结:

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

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

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

1,让 C++ 编程更符合人类思维习惯;

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

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

1,返回值不参与重载过程;

C++中的函数重载分析(一)的更多相关文章

  1. C++中的函数重载分析(二)

    1,重载与指针: 1,下面的函数指针将保存哪个函数的地址? int func(int x) { return x; } int func(int a, int b) { return a + b; } ...

  2. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  3. mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑

    mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...

  4. 程序代码中退出函数exit()与返回函数return ()的区别

    程序代码中退出函数exit()与返回函数return ()的区别   exit(0):正常运行程序并退出程序:   exit(1):非正常运行导致退出程序:   return():返回函数,若在主函数 ...

  5. mysql中find_in_set()函数的使用

    首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...

  6. QT中使用函数指针

    想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...

  7. Bash 是如何从环境变量中导入函数的

    在上文中曾说到: 所谓的环境变量的真实面目其实就是个任意字符串 Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量 Bash 在启动外部命令时会将自己内部标记为环境变 ...

  8. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  9. PHP中spl_autoload_register()函数的用法

    spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明 bool spl_autol ...

随机推荐

  1. 【NOIP2016提高A组模拟8.19】(雅礼联考day2)树上路径

    题目 给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E.(k为路径p上的边的权值和). 分析 点分治,设当前为x的,求在以x为根的子树中,经过x的路径(包括起点或 ...

  2. null转为数字的坑

    在项目中,需要用到某个字段等于0时来处理逻辑 if (+item.ext === 0) {} // 前面的+号是转为数字 // 如果item.ext 为 null时, +item.ext 就等于 0 ...

  3. error C2280: 尝试引用已删除的函数

    #include<unordered_map> struct SceneData { unordered_map<CString, CString> mConversation ...

  4. 什么是工作流java Activity

    见:http://www.it165.net/pro/html/201504/37443.html 一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假 ...

  5. node中controller的get和post方法获取参数

    1.get: const body = ctx.query; // get请求   2.post: const body = ctx.request.body; // post请求

  6. 【转】C语言中数组名和指针的区别

    注:本文转自http://www.cnblogs.com/furaibo/archive/2010/03/19/1689710.html 魔幻数组名 请看程序(本文程序在WIN32平台下编译): #i ...

  7. 一款新的好用的SSH工具——FinalShell,比XShell更牛逼~

    FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.特色功能:免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网穿 ...

  8. Phaser3 场景Scene之间的传值 -- HTML网页游戏开发

    一.首先当然得有至少有二个场景sceneA.js,sceneB.js 二.从场景A传值到场景B二种方法 1)通过事件this.events.emit('event key',{objKey:objVa ...

  9. mysql中主表与从表

    说个例子,比如用户表和银行帐号表,没有用户,那来的银行帐号,而且用户可以没有银行帐号,这里主要表现在银行帐号中这个表中必有用户表中的字段用户,这个主表则为用户表,而从表,则依附于主表. 主表在数据库中 ...

  10. nginx中lua主动设置Content-Length

    最近发现lua调用ngx.say和ngx.print 默认返回的HTTP头是trunk模式的,通常情况下是很好的,没有什么问题:但是要提供给其他人回源的时候就有问题了,特别是我要给slice模块回源, ...