函数的重载与重载解析
文章目录
- 前言
- 函数的重载是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);作为声明。
函数的重载与重载解析相关推荐
- 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )
文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...
- 函数重载函数的引用算重载吗_了解C ++中的函数重载
函数重载函数的引用算重载吗 介绍 (Introduction) Today in this tutorial, we are going to understand the concept of Fu ...
- TS中的方法重载,函数重载,构造器重载
什么叫重载 名字相同 ,参数类型不同 方法重载 方法重载在类中定义多个同名的方法,但是每一个同名的方法要求不同数据类型和不同参数 下面来实现一个方法重载 以ArrayList 为例 可以查看数据 可以 ...
- 【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载
1.全局函数和类成员函数转化 全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std;clas ...
- php函数unset,PHP unset函数 PHP unset函数原理及使用方法解析
想了解PHP unset函数原理及使用方法解析的相关内容吗,小猿笔记在本文为您仔细讲解PHP unset函数的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:PHP,unset函数,下面大家 ...
- java方法重载和重载方法_Java 8的方法参考进一步限制了重载
java方法重载和重载方法 方法重载一直是一个充满喜忧参半的话题. 我们已经在博客上介绍了它,并介绍了几次警告: 您会后悔对Lambdas应用重载! 保持干燥:方法重载 为什么每个人都讨厌操作员超载 ...
- 【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事
look here 运算符重载 赋值运算符重载 细节总结: – the End – 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以 ...
- c语言自定义函数程序设计,ch3自定义函数设计 C语言 《解析C程序设计》.ppt
ch3自定义函数设计 C语言 <解析C程序设计> 全局变量--外部变量 在函数外定义的变量 有效范围:从定义变量的位置开始到本源文件结束,及有extern声明的其它源文件 存储类型:缺省e ...
- java方法重载和重载方法_我们可以在Java中重载main()方法吗?
java方法重载和重载方法 The question is that "can we overload main() method in Java?" 问题是"我们可以在 ...
- JavaScript(三)—— JavaScript 函数/JavaScript 作用域/JavaScript 预解析/JavaScript 对象
本篇为 JavaScript 系列笔记第三篇,将陆续更新 JavaScript(一)-- 初识JavaScript/注释/输入输出语句/变量/数据类型 JavaScript(二)-- JavaScri ...
最新文章
- 平凡的80后 不平凡的人生路
- 数据结构火车订票系统C语言课程设计,求助一个数据结构C语言课程设计源代码订票系统^:^!...
- linux伙伴系统接口,Linux伙伴系统(一)--伙伴系统的概述
- dlog()是什么意思 matlab语言,Matlab
- Java 算法 能量项链
- [2019杭电多校第五场][hdu6630]permutation 2
- sqlalchemy 简介
- 超级计算机比赛规则,介绍围棋的规则与玩法
- 超级简单Python学生信息管理系统设计与实现.zip(论文+项目源码+使用说明书)
- 电脑插上U盘后不显示怎么办?
- 职中选什么专业好_职中选什么专业最有前途
- Excel VBA实现的简单电子病历管理
- 解读Unity中的CG编写Shader系列4——unity中的圆角矩形shader
- 《数值分析(原书第2版)》—— 2.4 PA=LU分解
- 岁岁年年人不同——LVS2019多媒体会议见闻(一)
- 【仿真】Carla之Traffic Manager [3]
- 关于平滑滤波,中值滤波,KNN滤波的图像处理(附matlab代码)
- KVM qcow2、raw、vmdk等镜像格式和转换
- TF报错及解决方法 Error: TF_DENORMALIZED_QUATERNION
- 万圣节习俗南瓜灯Jack-o’-lantern!