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++之函数重载 的相关文章

随机推荐

  • 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