C++之函数重载

2023-11-02

目录

1.函数重载

2.函数重载的概念:

3.编译器的工作:

4.判断函数重载的规则:

1.函数的重复声明

 2.参数表的比较过程与形参名无关.

3.如果在两个函数的参数表中

4.相同的参数列表。

5.形参是按值传递方式定义

6.参定义指针或引用

7.注意函数调用的二义性

8. 函数重载解析的步骤如下:


1.函数重载

C语言实现int, double,char 类型的比较大小函数。

int my_max_i(int a,int b) { reurn a > b ? a : b;}
double my_max_d(double a,double b) { return a > b ? a : b;}
char my_max_c(char a,char b) { return a > b ? a : b;}

这些函数都执行了相同的一般性动作;都返回两个形参中的最大值; 从用户的角度来看, 只有一种 操作 ,就是判断最大值, 至于怎样完成其细节,函数的用户一点也不关心。

这种词汇上的复杂性不是” 判断参数中的最大值 “ 问题本身固有的, 而是反映了程序设计环境的一 种局限性: 在同一个域中出现的名字必须指向一个唯实体(函数体) 。

这种复杂性给程序员带来了一个实际问题 ,他们必须记住或查找每一个函数名字。

函数重载把程序员从这种词汇复杂性中解放出来。

2.函数重载的概念:

在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;
}
double my_max(double a, double b)
{
	return a > b ? a : b;
}
//每个同名函数的参数表是惟一,
int main()
{
	int ix = my_max(12, 23);
	double dx = my_max(12.23, 34.45);
	char chx = my_max('a', 'b');
	cout << "ix: " << ix << "\n" << "dx: " << dx << "\n" << "chx: " << chx << endl;
	return 0;
}

3.编译器的工作:

当一个函数名在同一个域中被声明多次时,编译器按如下步骤解释第二个(以及后续的)的声明。 如果两个函数的参数表中参数的个数或类型或顺序不同,则认为这两个函数是重载。

例如:

// 重载函数
void print(int a,char b);
void print(char a,int b);

4.判断函数重载的规则:

1.函数的重复声明

如果两个函数的参数表相同, 但是返回类型不同,会被标记为编译错误:函数的重复声明。

int my_max(int a, int b)
{
	return a > b ? a : b;
}
unsigned int my_max(int a, int b) // error;
{
	return a > b ? a : b;
}
int main()
{
	int ix = my_max(12, 23);
	unsigned int = my_max(12, 23); // error;
	reutrn 0;
}

 2.参数表的比较过程与形参名无关.

// 声明同一个函数
int my_add(int a,int b);
int my_add(int x,int y);

3.如果在两个函数的参数表中

如果在两个函数的参数表中,只有缺省实参不同,则第二个声明被视为第一个的重复声明.

void Print(int *br,int n);
void Print(int *br,int len = 10);

4.相同的参数列表。

typedef 名为现有的数据类型提供了一个替换名,它并没有创建一个新类型 ,因此 ,如果两个函数参 数表的区别只在于一个使用了 typedef ,而另一个使用了与 typedef 相应的类型。则该参数表被视为相同的参数列表。

typedef unsigned int u_int;
int Print(u_int a)
int Print(unsigned int b);

5.形参是按值传递方式定义

当一个形参类型有 const 或 volatile 修饰时,如果形参是按值传递方式定义,在识别函数声明是否相同时 ,并不考虑 const 和 volatile 修饰符.

void fun(int a){ }
void fun(const int a) { }

6.参定义指针或引用

当一个形参类型有 const 或 volatile 修饰时,如果形参定义指针或引用时,在识别函数声明是否相同时 , 就要考虑 const 和 volatile 修饰符.

void fun(int *p) {}
void fun(const int *p) {}
void fun(int &a) {}
void fun(const int &a) {}

7.注意函数调用的二义性

如果在两个函数的参数表中,形参类型相同,而形参个数不同,形参默认值将会影响函数的重载.

void fun(int a){}
void fun(int a,int b){}
void fun(int a ,int b = 10);

8. 函数重载解析的步骤如下:

1 确定函数调用考虑的重载函数的集合, 确定函数调用中实参表的属性.

2 从重载函数集合中选择函数 ,该函数可以在 (给出实参个数和类型 )的情况下可以调用函数.

3 选择与调用最匹配的函数.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之函数重载 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单

随机推荐

  • v-model支input父子组件传值

    v model用于表单数据的双向绑定 其实它就是一个语法糖 这个背后就做了两个操作 v bind绑定一个value属性 v on指令给当前元素绑定input事件 自定义组件使用v model 应该有以下操作 接收一个value prop 触
  • 线程获取锁的顺序java_多线程(五) java的线程锁

    在多线程中 每个线程的执行顺序 是无法预测不可控制的 那么在对数据进行读写的时候便存在由于读写顺序多乱而造成数据混乱错误的可能性 那么如何控制 每个线程对于数据的读写顺序呢 这里就涉及到线程锁 什么是线程锁 使用锁的目的是什么 先看一个例子
  • Linux进程替换

    目录 进程替换 1 定义 2 为什么要进行进程替换 3 怎样进行进程程序替换 4 进程替换的原理 原理总结 5 Linux进程替换的函数 5 1参数 5 2函数返回值问题 5 3 execl函数用例 5 3 2升级案例 编辑 5 3 3调用
  • MySQL的DQL查询语句

    DQL 查询语句 1 排序查询 语法 order by 子句 order by 排序字段1 排序字段2 排序方式 ASC 升序 磨人的 DESC 降序 注意 如果有多个排序条件 则当前面的条件一致时 才会判断第二条件 2 聚合函数 将一列数
  • INS/GNSS组合导航(二)-INS常用的坐标系统及转换

    一 常用坐标系 由于INS是一种完全自主的导航系统 不与外界发生联系 但是我们又想知道物体的的位置 尤其是其与GNSS组合时需要知道其与GNSS在同一坐标系下的位置信息 这就牵扯到了INS的几个导航系统之间的转换 笼统的讲 INS输出的是载
  • springcloud整合consul

    搭建consul环境 linux安装consul 搭建生产者 1 建module provider payment8006 2 写pom
  • electron自动更新

    1 主进程background js引入autoUpdater let autoUpdater require electron updater 2 主进程写入更新代码 if process env WEBPACK DEV SERVER U
  • 图形学实验五曲线生成算法

    实验五 曲线生成算法 实验类型 设计型 实验学时 2实验要求 必修 一 实验目的 了解曲线的生成原理 掌握几种常见的曲线生成算法 利用VC OpenGL实现Bezier曲线生成算法 二 实验内容 1 分析空间曲线生成算法的原理 绘制其程序流
  • 2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真

    2017年综合测评仿真电路讲解 题目和结果链接 常用电路Multisim仿真 方波 三角波振荡电路 常用电路Multisim仿真 有源低通滤波器设计 常用电路Multisim仿真 数字芯片74LS74构建分频器设计 常用电路Multisim
  • python 主力资金_真正的主力进场加仓指标源码

    import numpy as np def initialize context g up price 向上碎形最高价 g low price 向下碎形最低价 g up fractal exists 判断有效向上碎形 g down fra
  • Mybatis-Plus学习---(五)灵活使用wapper条件构造器

    手都敲麻了 翻译自官方 条件构造器 说明 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中 例如 query like StringUtils isNotBlank name Entity getN
  • Linux 安装 MariaDB

    CentOS 7 自带的 MariaDB 是 5 5 版本的 使用 yum install mariadb server 命令安装的默认版本是 5 5 的 这是因为系统默认源只有 5 5 的版本 安装准备 检查是否安装过 MariaDB 或
  • MapInfo数据格式

    MapInfo采用双数据库存储模式 即其空间数据与属性数据是分开来存储的 属性数据存储在关系数据库的若干属性表中 而空间数据则以MapInfo的自定义格式保存于若干文件中 二者通过一定的索引机制联系起来 为了提高查询和处理效率 MapInf
  • Octave Convolution[论文详解]

    Drop an Octave Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution github 传统的卷积运算 要成为过去
  • 利用 Transformer 网络建立预测模型

    引言 我最近读了一篇非常有趣的论文 Deep Transformer Models for Time Series Forecasting The Influenza Prevalence Case 我认为这可能是一个有趣的项目 从零开始实
  • 【stm32】串口通信

    串口通信 一 串口通信协议原理 二 usart功能框图 三 stm32库的配置 一 串口通信协议原理 串口在嵌入式系统当中是一类重要的数据通信接口 其本质功能是作为 CPU 和串行设备间的编码转换器 当数据从 CPU 经过串行端口发送出去时
  • 基于PIO把带有数据和图片的excel表导入到数据库中(图片存储到服务器中,可访问图片路径存入在数据库中)

    基于PIO把带有数据和图片的excel表导入到数据库中 图片存储到服务器中 可访问图片路径存入在数据库中 文章目录 基于PIO把带有数据和图片的excel表导入到数据库中 图片存储到服务器中 可访问图片路径存入在数据库中 前言 创作来之不易
  • Java是一门什么样的语言?

    Java是一门高级编程语言 java 原名OKA 橡树 由Sun公司从1991到1995年之间研发 由于OKA被注册 后更改未JAVA 1995年 Oka 正式更名为java 1996年 Sun正式发布 第一个 java 开发者工具包 JD
  • PAT----7-20 打印九九口诀表 (15分)

    下面是一个完整的下三角九九口诀表 1 1 1 1 2 2 2 2 4 1 3 3 2 3 6 3 3 9 1 4 4 2 4 8 3 4 12 4 4 16 1 5 5 2 5 10 3 5 15 4 5 20 5 5 25 1 6 6 2
  • C++之函数重载

    目录 1 函数重载 2 函数重载的概念 3 编译器的工作 4 判断函数重载的规则 1 函数的重复声明 2 参数表的比较过程与形参名无关 3 如果在两个函数的参数表中 4 相同的参数列表 5 形参是按值传递方式定义 6 参定义指针或引用 7