文章目录

  • 前言
    • 函数的重载是C++不同于C语言的一个地方,他使得我们可以使用相同的函数名定义不同的函数。
  • 一、注意事项
  • 二、底层原理
  • 三、名称查找
    • 1.限定查找
    • 2.非限定查找

前言

函数的重载是C++不同于C语言的一个地方,他使得我们可以使用相同的函数名定义不同的函数。

提示:以下是本篇文章正文内容,下面案例可供参考

一、注意事项

使用相同的函数名定义不同函数时,每个函数要具有不同的参数列表

int fun(int x)
{...}
int fun(int x,int y)//这两个同名函数包含的元素个数不同,可以这样定义
{...}
int fun(int x)
{...}
int fun(double x)//这两个同名函数包含的元素类型不同,可以这样定义
{...}
int fun(int x)
{...}
int fun(int y)//这两个同名函数包含的元素个数和类型相同,不可以这样定义。因为int x和int y所代表的形参本质上一样
{...}
int fun(int x)
{...}
double fun(int x)//这两个同名函数包含的元素个数和类型相同,不可以这样定义,虽然返回类型不同,但是参数列表相同,这样也不行
{...}

同理还有

int fun(int x)
{...}
double fun(const int x)//g++认为const int 和int是一个平凡转换,是同级别的东西,所以也会重定义
{...}

二、底层原理

这里涉及到一个mangling问题
mangling的目的就是为了给重载的函数不同的签名,以避免调用时的二义性调用。
举个栗子

void func(char)
void func(int)
void func(int, int)
void func()

编译后对应的编码

0000000000000040 T __Z4funcc
0000000000000020 T __Z4funci
0000000000000030 T __Z4funcii
0000000000000010 T __Z4funcv

不同的func()对应不同的码,方便计算机区分


三、名称查找

由于函数重载的关系,一个翻译单元内可能会有多个同名函数,那么调用的时候怎么知道要调用哪一个呢?
调用时有以下规则

1.限定查找

比如我指定在某个名字空间内查找
namespace::fun()

2.非限定查找

如果没有指定名字空间,那就优先现在当前域内查找,逐级向外查找。注意查找时要从下向上找。因为程序是从上向下进行处理的

void fun(int)//第一个fun
{std::cout<<1;}namespace MYNS
{void g(){fun(3);}void fun(double)//第二个fun{std::cout<<2;}
}
int main()
{MYNS::g();
}

比如我们看上面这个程序,主函数里调用g()时,会打印出1,因为虽然第二个fun()在当前域内,但因为程序是从上向下进行处理的,调用g()时他不知道MYNS里有fun函数。除非你在void g()前面加一句void fun(double);作为声明。

函数的重载与重载解析相关推荐

  1. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  2. 函数重载函数的引用算重载吗_了解C ++中的函数重载

    函数重载函数的引用算重载吗 介绍 (Introduction) Today in this tutorial, we are going to understand the concept of Fu ...

  3. TS中的方法重载,函数重载,构造器重载

    什么叫重载 名字相同 ,参数类型不同 方法重载 方法重载在类中定义多个同名的方法,但是每一个同名的方法要求不同数据类型和不同参数 下面来实现一个方法重载 以ArrayList 为例 可以查看数据 可以 ...

  4. 【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

    1.全局函数和类成员函数转化 全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std;clas ...

  5. php函数unset,PHP unset函数 PHP unset函数原理及使用方法解析

    想了解PHP unset函数原理及使用方法解析的相关内容吗,小猿笔记在本文为您仔细讲解PHP unset函数的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:PHP,unset函数,下面大家 ...

  6. java方法重载和重载方法_Java 8的方法参考进一步限制了重载

    java方法重载和重载方法 方法重载一直是一个充满喜忧参半的话题. 我们已经在博客上介绍了它,并介绍了几次警告: 您会后悔对Lambdas应用重载! 保持干燥:方法重载 为什么每个人都讨厌操作员超载 ...

  7. 【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事

    look here 运算符重载 赋值运算符重载 细节总结: – the End – 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以 ...

  8. c语言自定义函数程序设计,ch3自定义函数设计 C语言 《解析C程序设计》.ppt

    ch3自定义函数设计 C语言 <解析C程序设计> 全局变量--外部变量 在函数外定义的变量 有效范围:从定义变量的位置开始到本源文件结束,及有extern声明的其它源文件 存储类型:缺省e ...

  9. java方法重载和重载方法_我们可以在Java中重载main()方法吗?

    java方法重载和重载方法 The question is that "can we overload main() method in Java?" 问题是"我们可以在 ...

  10. JavaScript(三)—— JavaScript 函数/JavaScript 作用域/JavaScript 预解析/JavaScript 对象

    本篇为 JavaScript 系列笔记第三篇,将陆续更新 JavaScript(一)-- 初识JavaScript/注释/输入输出语句/变量/数据类型 JavaScript(二)-- JavaScri ...

最新文章

  1. 平凡的80后 不平凡的人生路
  2. 数据结构火车订票系统C语言课程设计,求助一个数据结构C语言课程设计源代码订票系统^:^!...
  3. linux伙伴系统接口,Linux伙伴系统(一)--伙伴系统的概述
  4. dlog()是什么意思 matlab语言,Matlab
  5. Java 算法 能量项链
  6. [2019杭电多校第五场][hdu6630]permutation 2
  7. sqlalchemy 简介
  8. 超级计算机比赛规则,介绍围棋的规则与玩法
  9. 超级简单Python学生信息管理系统设计与实现.zip(论文+项目源码+使用说明书)
  10. 电脑插上U盘后不显示怎么办?
  11. 职中选什么专业好_职中选什么专业最有前途
  12. Excel VBA实现的简单电子病历管理
  13. 解读Unity中的CG编写Shader系列4——unity中的圆角矩形shader
  14. 《数值分析(原书第2版)》—— 2.4 PA=LU分解
  15. 岁岁年年人不同——LVS2019多媒体会议见闻(一)
  16. 【仿真】Carla之Traffic Manager [3]
  17. 关于平滑滤波,中值滤波,KNN滤波的图像处理(附matlab代码)
  18. KVM qcow2、raw、vmdk等镜像格式和转换
  19. TF报错及解决方法 Error: TF_DENORMALIZED_QUATERNION
  20. 万圣节习俗南瓜灯Jack-o’-lantern!

热门文章

  1. 一次性永远激活7290自带浏览器上网和彩信收发功能
  2. 芯片架构RISC-V、X86、ARM三足鼎立
  3. Python实战:淘宝自动抢购
  4. vue mounted遇到的问题
  5. 8MSaaS PM:如何管理银行项目?
  6. 树莓派4b搭建danted socks5 代理服务器 利用闲置宽带扩展搬砖IP
  7. photoshop时钟制作过程
  8. 系统提示内部服务器错误是怎么回事,XP系统提示“HTTP500内部服务器错误”是怎么回事...
  9. Metrics 简介
  10. 设计模式之代理模式、动态代理模式、Cglib代理模式