C++浅析函数重载是什么

目录
  • 前言
  • 函数重载
  • 一些其他问题
    • 2.1 int和char怎么区分
    • 2.2 传值

前言

这是一个非常重要的点

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数。

这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题

或者说,给一个名字赋予第二层意义,一词多义,有点内涵那意思

函数重载

首先C语言不允许定义同名的函数,但是C++可以,原因就涉及到了函数重载

函数重载的要求:函数名相同,参数不同(参数类型不同,参数个数不同)

例子:

定义三个函数名相同的函数,在C++中可以构成函数重载

这三个函数的函数名一样,但是类型不同

int ADD(int left, int right) {
	return left + right;
}
double ADD(double left, double right) {
	return left + right;
}
long ADD(long left, long right) {
	return left + right;
}

它们的类型分别是int,double,long。

而且个数不同也能构成函数重载。

下面来打印玩一下(刚开始玩打印很正常,但是工作中很少用)

int main(void) {
	cout << ADD(1,2) << endl;
	cout << ADD(1.2, 2.2) << endl;
	cout << ADD(40l, 40l) << endl;
	return 0;
}

结果:

感觉是调用的是一个函数,但其实不止一个,因为这个函数被重载了,所以有三层定义。

实际上调用的是

1:int类型的

2:double类型的

3:long类型的。

一些其他问题

缺省算不算重载 ?

//NO.1
int ADD(int left, int right) {
	return left + right;
}
//NO.2
int ADD(int left = 1, int right = 2) {
	return left + right;
}

注意 : NO.1和NO.2两个不算重载,因为构成重载的条件是参数的类型不同或者个数不同,以上均不满足 。重载只看类型

但是

//NO.2
int ADD(int left = 1, int right = 2) {
	return left + right;
}
//NO.3
double ADD(double left, double right) {
	return left + right;
}

NO.2和NO.3是构成重载的,因为满足了重载的条件

函数重载的要求:函数名相同,参数不同(参数类型不同,参数个数不同)

综上所述,缺省和重载没有关系!

2.1 int和char怎么区分

int ADD(int left = 10, int right = 20) {
	return left + right;
}
char ADD(char left, char right) {
	return left + right;
}
int main() {
	cout << ADD() << endl;
	//cout << ADD(1,2) << endl;	//(1,2)字面量常量,
	//默认给十进制,十六进制等等,给的整形默认算常量
	//如果调用char
	cout << ADD('1', '2') << endl;	//char类型打印,自动按%c,字符类型→	→	→	→	→	↓
	//传字符才调用char类型的																↓
	//																					↓
	//char类型的字符只是显示表面,深入剖析的话在内存中,它存储在4byte中,是它对应的ASCII码值	↓
	//ASCII码值还是整形,只不过是1byte													↓
	//char类型存的值是‘49',‘50'.	←	←	←	←	←	←	←	←	←	←	←	←	←	←
	//对应的是c。c在ASCII码值中是99	←	←	←	←	←	←	←	←	←	←	←	←	←	←
	return 0;
}

总结:

1.char和int都是表示整形的,整形一般都是用来表示大小,只不过int是4byte,char是1byte

2.char的1byte是用来表示ASCII码值的字母,多个字母可以表示英文,就能表示文字了

2.2 传值

有三个值,但是缺省了一个,传的时候只传了两个

void lost(int a, int b, int c = 1) {
}
void lost(int a, int b) {
}
//以上构成函数重载,函数名相同,参数或者个数不同
int main() {
	lost(1, 2, 3);
	lost(1,2);
	//↑是编不过去的,
	return 0;
}

总结:

1. 有多个重载函数“lost”实例与参数列表匹配

2. 编译器不能识别要调用哪一个“lost”对重载函数的调用不明确

3. 构成重载但是调用的时候埋了一个坑

到此这篇关于C++浅析函数重载是什么的文章就介绍到这了,更多相关C++函数重载内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 函数重载背后的原理

    目录 函数重载 函数重载的原理 为何C++可以支持重载 程序的编译链接 C语言为何不支持重载 C++为何可以支持函数重载 C++和C语言相互调用 创建静态库 C++调用C extern “C” extern “C” 原理 C语言调用C++ C++ 注意事项 extern "C"修饰的函数和一个函数完全一样 extern "C"修饰的函数和一个函数构成重载 函数重载 我们可能对函数很是熟悉,但是重载又是什么意思呢?我们先来用一个具体的场景来分享. 一天,张三的老板要你

  • C++入门语法之函数重载详解

    目录 写在前面 1 函数重载的概念 2 函数重载原理 总结 写在前面 关于C语言的编译与链接不懂的可以看一下下面的文章,先回顾一下以前的知识. 详解C语言的编译与链接 1 函数重载的概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题. //1.函数的参数个数不同 #include <iostream> using namespace std; void

  • C++函数重载的定义与原因详解

    目录 引例 函数重载的定义 函数重载规则 为什么C不支持函数重载而C++可以 内部名称 总结 引例 如果要求你只能通过print函数,即能打印字符串,又能打印一个整型. 虽然在C语言中我们可以通过 print_i 和print_s来实现功能. 但是C++更方便.C++支持同一函数名,完成类似的功能的语法. void print(int i) { cout << "print a integer :" << i << endl; } void prin

  • C++深入分析回顾函数重载

    目录 一.函数重载回顾 二.类中的重载 三.重载的意义 四.小结 一.函数重载回顾 函数重载的本质为相互独立的不同函数 C++ 中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 二.类中的重载 类中的成员函数可以进行重载 构造函数的重载 普通成员函数的重载 静态成员函数的重载 问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载? 注意事项 重载函数的本质为多个不同的函数 函数名和参数列表是唯一的标识 函数重载必须发生在同

  • C++深入浅出讲解函数重载

    目录 前言 函数重载 1.1 函数重载的概念 1.2 函数重载的意义 1.3 名字修饰(name Mangling) 1.4 extern "C" 前言 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了. 比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心.一个是乒乓球,一个是男足.前者是“谁也赢不了!”,后者是“谁也赢不了!” 函数重载 1.1 函数重载的概念 函数重载: 它是函数的一种特殊情况,C++允许在同一作用域中同一作用域

  • C++超详细讲解函数重载

    目录 1 函数重载的定义 2 构成函数重载的条件 3 编译器调用重载函数的准则 4 函数重载的注意事项 4.1 避开重载带有指定默认值参数的函数 4.2 注意函数重载遇上函数指针 4.3 C++编译器不能以 C 的方式编译重载函数 1 函数重载的定义 函数重载:使用同一个函数名定义不同的函数.从本质上来看,就是互相独立的不同函数,每一个函数类型不同.因此,函数重载是由函数名和参数列表决定的. 注意:函数返回值不能作为函数重载的重要依据! 2 构成函数重载的条件 当满足以下三个条件之一时,便可以构

  • C++超详细分析函数重载的使用

    目录 一.函数重载分析(上) 1.1 重载的定义 1.2 函数重载的定义 1.3 函数重载需要满足的条件 1.4 编译器调用重载函数的准则 1.5 函数重载的注意事项 1.6 小结 二.函数重载分析(下) 2.1 函数重载遇上函数指针 2.2 C++和C的相互调用 2.3 使得C代码只会以C的方式被编译的解决方案 2.4 小结 一.函数重载分析(上) 1.1 重载的定义 定义:同一个标识符在不同的上下文有不同的意义 1.2 函数重载的定义 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时

  • C++深入讲解函数重载

    目录 函数重载 概念 重载依据 值型别 判断函数重载的规则 名字粉碎-名字修饰 函数重载 概念 在C++中可以为两个或者两个以上函数提供相同的函数名称,只要参数类型不同,或者参数数目不同,参数顺序不同,即参数表不同,那么就认为是函数的重载.(函数名+参数表) // my_max + 参数表 int my_max(int a,int b) { return a > b ? a : b; } char my_max(char a,char b) { return a > b ? a : b; }

  • C++浅析函数重载是什么

    目录 前言 函数重载 一些其他问题 2.1 int和char怎么区分 2.2 传值 前言 这是一个非常重要的点 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数. 这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题 或者说,给一个名字赋予第二层意义,一词多义,有点内涵那意思 函数重载 首先C语言不允许定义同名的函数,但是C++可以,原因就涉及到了函数重载 函数重载的要求:函数名相同,参数不同(参数类型不同,

  • JavaScript函数重载操作实例浅析

    本文实例讲述了JavaScript函数重载操作.分享给大家供大家参考,具体如下: 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都很难,根本回答不上来.不过那天晚上,还是很惊喜的接到了HR面电话.现在HR面试的结果还没有出来,听说要等到下周二才出,所以再好好等几天哈. 前面说了这多的废话,现在是时候和伙伴们分享一下面试干货哈.因为二面问到的内容还挺多的,所以这里就不全部列举出来了.这里只讨论一下函数的重载. 下面是面试

  • 通过实例理解javascript中没有函数重载的概念

    将函数名想象为指针,也有助于理解为什么ECMAScript中没有函数重载的概念.如下例子: 复制代码 代码如下: function addSomeNum(num) {     return num+100; } function addSomeNum(num) {     return num+200; } var result=addSomeNum(100);//300 显然,这个例子中声明了两个同名函数,而结果则是后面的函数覆盖了前面的函数.以上代码实际上与下面的代码是一致的. 复制代码 代

  • C++中const用于函数重载的示例代码

    常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字. (2)const关键字可以用于对重载函数的区分. (3)常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数. (4)非常量对象也可以调用常成员函数,但是如果有重载的非常成员函数则会调用非常成员函数. 重载看例子: #include<iostream> u

  • 详解JS函数重载

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,所有的实参都是保存在了这个数据结构里面,我们定义函数的时候所指定的形式参数其实是为这个数据结构里面的数据定义一个快捷的访问方式.也就是说js所有的函数都是支持无限个参数的,加上数据类型是弱类型,那么JS的函数除了名称就真的没有方法区别了? 办法总是有的,我们可以利用JavaScript中

  • JS函数重载的解决方案

    在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数.类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作. 在JS的函数执行上下文中有一个名为arguments的有意思的变量,它以数组的形式存储了函数执行时传递过来的所有参数,即使函数定义没有定义这 么多个形参.还有一个特别之处就是跟Array类型相比,arguments变量有且只有一个length属性,Array的方法,例如push.pop 等,它并不具备,它只是一个"伪数组":具有length属性,存

  • php函数重载的替代方法--伪重载详解

    函数重载的替代方法-伪重载,下面看一个具体的实例代码. <? php //函数重载的替代方法-伪重载 // //确实,在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数 //在看到了func_get_arg,func_get_args,func_num_args,这三个函数的时候,你们是不是想起了什么? function testOne ( $a ) { echo (' 一个参数就这样 '); } function testTwo ( $a

  • PHP利用func_get_args和func_num_args函数实现函数重载实例

    本文实例讲述了PHP利用func_get_args和func_num_args函数实现函数重载的方法.分享给大家供大家参考.具体方法分析如下: 学习php的朋友都知道php本身是没有函数重载这一说的,更没说像java,c那样使用方法,但如果我们深入了解一下会发现可以在php中使用func_get_args()和func_num_args()函数实现函数重载,下面来举两个函数重载例子.这两个函数实现函数的重载. 1.默认参数,如果一个函数里面,这不是必须参数,而添加相应的默认值,就可以完成相应的功

  • javascript函数重载解决方案分享

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,所有的实参都是保存在了这个数据结构里面,我们定义函数的时候所指定的形式参数其实是为这个数据结构里面的数据定义一个快捷的访问方式.也就是说js所有的函数都是支持无限个参数的,加上数据类型是弱类型,那么JS的函数除了名称就真的没有方法区别了? 办法总是有的,我们可以利用JavaScript中

  • 让JavaScript 轻松支持函数重载 (Part 1 - 设计)

    JavaScript支持重载吗? JavaScript支持函数重载吗?可以说不支持,也可以说支持.说不支持,是因为JavaScript不能好像其它原生支持函数重载的语言一样,直接写多个同名函数,让编译器来判断某个调用对应的是哪一个重载.说支持,是因为JavaScript函数对参数列表不作任何限制,可以在函数内部模拟对函数重载的支持. 实际上,在很多著名的开源库当中,我们都可以看到函数内部模拟重载支持的设计.例如说jQuery的jQuery.extend方法,就是通过参数类型判断出可选参数是否存在

随机推荐