C++基础——函数重载

news/2024/5/10 10:18:31/文章来源:https://blog.csdn.net/weixin_69283129/article/details/127741453

目录

一.函数 重载的三种形式:

1.参数个数不同的重载函数

2. 类型上的不同重载函数

3. 类型顺序上的不同重载函数

二.函数重载+缺省参数

返回值不同,能不能构成函数重载?


重载:

        重新赋予意义,可以认为是一词多义,例如:算账:基本义是计算账目;也指吃亏或失败后与人较量。八面玲珑:原指四面八方通明敞亮;也形容特例外观挺拔秀丽;多用来形容从处世圆滑或办事细致周到等意思。

函数重载:

        是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或者 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

一.函数 重载的三种形式:

1.参数个数不同的重载函数

#include<iostream>
using namespace std;void F() {	//无参cout << "F()" << endl;
}void F(int a) {	//带参cout << "F(int a)" << endl;
}int main() {F();F(10);return 0;
}

 结果:

2. 类型上的不同重载函数

void Swap(double* p1, double* p2) {double tmp = *p1;*p1 = *p2;*p2 = tmp;
}void Swap(int* p1, int* p2) {int tmp = *p1;*p1 = *p2;*p2 = tmp;
}int main() {int a = 10, b = 20;double c = 15.5, d = 20.6;Swap(&a, &b);Swap(&c, &d);cout << "a:" << a << " b:" << b << endl;cout << "c:" << c << " d:" << d << endl;return 0;
}

结果: 

3. 类型顺序上的不同重载函数

void F(int a, char b) {cout << "F(int a, char b)" << endl;
}void F(char a, int b) {cout << "F(char a ,int b)" << endl;
}int main() {F(10, 'A');	//输出第一个函数结果F('A', 20);	//输出第二个函数结果return 0;
}

 结果:

 注:顺序不同,是类型上的数据不同,而非是形参随意调换顺序!!如下:

void F(int a, char b) {cout << "F(int a, char b)" << endl;
}void F(char b,int a) {cout << "F(int a, char b)" << endl;
}

这俩函数不构成重载,第二个函数的形参只是对调了一下顺序而已,其他完全一样。 

二.函数重载+缺省参数

例:

void F() {cout << "Hello World" << endl;
}void F(int a = 10, int b = 20) {cout << "Hello c++" << endl;
}int main() {F(40);	F(24, 73);	F();return 0;
}

解析:F(10); 会调用第二个F函数,那么a=40,b=20;                                                                           F(24,73); 会调用第二个F函数,  a=24,b=73;                                                                           F();     有歧义,它既符合第一个无参F函数的调用,也符合第二个全缺省F函数的调用(不放实参,默认使用缺省的形参值),这让系统为难,对重载函数调用不明确。

       在学C语言时,它并不支持函数重载,在运行的时候时,会有三个阶段:预处理、编译、汇编。


预编译:在预编译阶段,编译器大致会做: 头文件的展开,删除注释,条件编译,宏替换
            生成test.i文件

编译:在编译阶段,编译器会:将C语言代码转换成汇编代码(test.s);进行语法分析,词法分析,             语义分析;符号汇总

汇编:在汇编阶段,编译器会把汇编代码转换成二进制指令(test.o),形成符号表.

链接:在链接阶段,链接器会合并段表;符号表的合并和重定位;找调用函数的地址,链接对应上,合并到一起最终生成可执行文件test.exe.

        当C语言在编译过程生成符号表时,它的函数在符号表中的名字就只是用自定义的函数名来表示,所以,如果在C语言中写了函数重载,那么它会在符号表中生成两个名字一模一样的函数名,地址完全相同,那这样在链接的过程中它的符号表中会有两个完全一样的函数名地址,那编译器不知道该找哪个。

所以,这个时候就发生了错误.这也就是C语言不能支持重载的原因.

        C++设计了一个函数名修饰规则,用函数名+参数类型为标准去区分各个重载函数的不同。C语言对函数名没有任何修饰,只有一个地址;而C++对函数名做了一定修饰,参数不同,修饰出来的名字就不同!!!如下图:

 

例题:


int F(int a, char b) {cout << "F(int a,char b)!" << endl;return 0;}char F(char a, int b) {cout << "F(int a,char b)" << endl;return 'A';
}int main() {F(10,'a');F('a',10);return 0;
}

如上题代码所示,返回值不同,能不能构成函数重载?

        答案:不能,函数重载取决于参数的个数,类型,顺序。而和返回值类型无关,所以返回值的不同,并不构成重载原因,——返回值的不同并不是函数修饰的规则
真正的原因是:函数调用的二义性,编译器无法区分该选哪个去用,所以调用时并不指定返回值类型。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_223745.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AssetBundle检测服务使用指南

熟悉UWA的老朋友都知道&#xff0c;UWA有个经典的免费SaaS服务 - 「在线AssetBundle检测」&#xff0c;可以检测包括纹理、网格、动画片段、材质等项目资源使用情况和具体冗余程度。通过快速查看特定的AssetBundle、资源文件和脚本信息&#xff0c;以及AssetBundle和资源之间的…

JAVA线程池 -clt设计与分析

1. 前言 ctl 是线程池源码中常常用到的一个变量。它的主要作用是记录线程池的生命周期状态和当前工作的线程数。作者通过巧妙的设计&#xff0c;将一个整型变量按二进制位分成两部分&#xff0c;分别表示两个信息。 2. 源码解析 源码部分 /*** The main pool control state,…

Pytorch学习笔记6——时间序列RNN

Pytorch学习笔记6——时间序列 判断态度的二分类问题&#xff1a; 对于长句子不适合&#xff0c;因此需要权值共享&#xff1a; 对于某一层&#xff1a; 上一步输出作为下一步输入&#xff0c;存储语境信息&#xff1a; 自我更新语境信息ht ht是最后一次送入得到的m…

提出创意的方法

提出创意的方法 “我不擅长想出创意。” 你是否经常对自己说这样的话? 在公司的会议和学校的集体工作中总是提不出好点子。 即使提出了很多创意&#xff0c;也会偏向于相同的创意&#xff0c;无法得出有趣的提案。 为了打破这样的状况&#xff0c;这次的博客介绍创造性想法…

排序算法:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序

排序算法相关总结&#xff0c;涉及的排序算法有&#xff1a;插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序。 这里写目录标题1.插入排序2.冒泡排序3.选择排序4.希尔排序5.堆排序6.快速排序总结稳定性概念: 假定在待排序的记录序列中&#xff0c;存在多个具有相同的…

缓冲区的管理

文章目录什么是缓冲区&#xff1f;有什么作用&#xff1f;单缓冲单缓冲和双缓冲通信时的区别循环缓冲区缓冲池什么是缓冲区&#xff1f;有什么作用&#xff1f; 缓冲区是一个存取区域&#xff0c;可以由专门的硬件寄存器组成&#xff0c;也可以用内存作为缓冲区&#xff0c;本节…

Python中的几种推导式用法,先收藏再说......

嗨害大家好鸭&#xff01;我是小熊猫❤ 今天我们来整点非常干的干货&#xff1a; 源码、资料电子书点击此处 Python 推导式是一种独特的数据处理方式&#xff0c; 可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式&#xff1a; 列表(li…

D. Maximum Sum on Even Positions(最大连续字段和)

Problem - 1373D - Codeforces 题意: 给你一个由n个整数组成的数组a。数组的索引从零开始&#xff08;即第一个元素是a0&#xff0c;第二个是a1&#xff0c;以此类推&#xff09;。 你最多可以扭转这个数组的一个子数组&#xff08;连续子段&#xff09;。回顾一下&#xff0c…

[附源码]计算机毕业设计JAVAjsp不回头药店药品管理系统

[附源码]计算机毕业设计JAVAjsp不回头药店药品管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SS…

【Prometheus】什么是prometheus?prometheus简介

本文目录 一、什么是prometheus&#xff1f; 二、体系结构概述 三、适用场景 四、不适用的场景 一、什么是prometheus&#xff1f; Prometheus官网 Prometheus开源代码 From metrics to insight Power your metrics and alerting with the leading open-source monitoring…

随想录一刷Day48——动态规划

文章目录Day48_动态规划29. 打家劫舍30. 打家劫舍 II31. 打家劫舍 IIIDay48_动态规划 29. 打家劫舍 198. 打家劫舍 思路&#xff1a; 题目的关键是&#xff0c;不能偷相邻的两个屋子&#xff0c;即只能偷上一个屋子不偷当前屋子&#xff0c;或者不偷上一个屋子偷当前屋子。 d…

LeetCode刷题(python版)——Topic57插入区间

一、题设 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;interva…

ServletConfig和ServletContext接口

一、ServletConfig接口详解 1、简介 Servlet 容器初始化 Servlet 时&#xff0c;会为这个 Servlet 创建一个 ServletConfig 对象&#xff0c;并将 ServletConfig 对象作为参数传递给 Servlet 。通过 ServletConfig 对象即可获得当前 Servlet 的初始化参数信息。一个 Web 应用中…

【仿牛客网笔记】 Redis,一站式高性能存储方案——Redis入门

Redis可以开发对性能要求较高的功能。还可以利用Redis重构我们现有的功能。 NoSQL关系型数据库之外的统称。 快照有称为RDB 以快照的形式 不适合实时的去做&#xff0c;适合一段时间做一次。 日志又称AOF 以日志的形式每执行一次就存入到硬盘中&#xff0c;可以做到实时的存储以…

【python的静态方法,classmethod方法和__call___魔法方法】

classmethod魔法方法和staticmethodstaticmethod&#xff0c;静态方法classmethod&#xff0c;绑定类方法__call__&#xff0c;可调用类类方法staticmethod&#xff0c;静态方法 在python中&#xff0c;使用静态方法可以实现不需要实例化对象的绑定就可以直接调用的函数&#…

【Unity3D】游戏物体操作 ④ ( 选中多个游戏物体操作 | 复制选中物体 | 聚焦选中物体 | 激活、禁用选中物体 | 对齐选中物体 )

文章目录一、选中多个游戏物体操作1、Scene 场景窗口选中多个物体2、Hierarchy 层级窗口选中多个物体二、复制选中物体1、使用 " Ctrl D " 快捷键复制物体2、使用 右键菜单 | Duplicate 选项复制三、聚焦选中物体四、激活、禁用选中物体五、对齐选中物体一、选中多个…

计算机组成原理浮点数表示

浮点数表示 浮点数的表示分为阶码和尾数&#xff1b; 比如3.026*1011;阶码是11;尾数是3.026&#xff1b; 对于阶码&#xff1a; 阶符为正&#xff0c;小数点向后移n位&#xff08;n表示阶的大小&#xff09;; 阶符为负&#xff0c;小数点向前移n位&#xff08;n表示阶的大小&a…

AttributeError: ‘bytes‘ object has no attribute ‘encode‘异常解决方案

AttributeError: bytes object has no attribute encode是&#xff1a;“字节”对象没有属性的编码的意思。 很明显&#xff0c;是编码格式的问题&#xff0c;例如&#xff1a;已经是byte格式的字符串类型&#xff0c;二次进行encode的时候就会出现这个bug&#xff0c;示例如下…

【猿创征文】Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo

前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli&#xff0c;但在中大型的企业级项目中&#xff0c;通常会自主搭建这些脚手架或加速器。优雅哥希望每位前端伙伴能知其所以然&#xff0c;故接下来的文…

基础IO(下)——Linux

文章目录1. 理解文件系统1.2 背景知识1.2 inode vs 文件名1.3 软硬链接2. 动态库和静态库2.1 静态库.a2.1.1 如果想写一个库&#xff1f;&#xff08;编写库的人的角度&#xff09;2.1.2如果我把库给别人&#xff0c;别人怎么用呢&#xff1f;&#xff08;使用库的人的角度&…