【C++入门(3)】函数重载、引用

一、函数重载

1、函数重载概念

函数重载是指在同一作用域中,具有不同形参列表(参数的 个数 或 类型 或类型顺序 不同)的同名函数。

C语言中不允许同名函数的存在,如果一个程序中有两个函数的函数名完全相同,就会报错。而C++中是允许同名函数的存在的。比如下面这段代码,在C语言中编译不过去,在C++中则可以编译通过:

void Swap(int* pa, int* Pb)
{
	;
}

void Swap(double* pa, double* pb)
{
	;
}

2、构成函数重载条件

(1)在同一作用域中

只有在同一作用域中的函数,才可以构成重载。

以下两个函数构成函数重载:

namespace test_1 {
	void Swap(int* pa, int* Pb)
	{
		cout << "void Swap(int* pa, int* Pb)" << endl;
	}

	void Swap(double* pa, double* pb)
	{
		cout << "void Swap(double* pa, double* pb)" << endl;
	}
}

以下两个函数不构成函数重载:

namespace test_1 {
	void Swap(int* pa, int* Pb)
	{
		cout << "void Swap(int* pa, int* Pb)" << endl;
	}
}
namespace test_2 {
	void Swap(double* pa, double* pb)
	{
		cout << "void Swap(double* pa, double* pb)" << endl;
	}
}

在下面这个例子中,两个Swap函数虽然不构成函数重载,但是也是可以同时存在于程序中的,因为他们在不同的命名空间中,使用它们时需要用域作用限定符指定命名空间,变相的使函数名有了区别。如果在这段程序中同时展开了test_1和test_2这两个命名空间,重名使用这两个函数,程序也会出错。但是此时错误原因不是非法的函数重载,而是命名空间引用不明确,属于调用歧义:

(2)参数个数不同

void Swap(int* pa)
{
	cout << "void Swap(int* pa)" << endl;
}
void Swap(int* pa, int* pb)
{
	cout << "void Swap(int* pa, int* pb)" << endl;
}

(3)参数类型不同

void Swap(int* pa, int* pb)
{
	cout << "void Swap(int* pa, int* pb)" << endl;
}
void Swap(double* pa, double* pb)
{
	cout << "void Swap(double* pa, double* pb)" << endl;
}

(4)参数类型顺序不同

void Swap(char* pa, int* pb)
{
	cout << "void Swap(char* pa, int* pb)" << endl;
}
void Swap(int* pa, char* pb)
{
	cout << "void Swap(int* pa, char* pb)" << endl;
}

3、不构成函数重载

(1)返回类型不同

返回类型不同时,函数不构成重载关系。因为没有返回值的函数不需要变量来接收返回值,而有返回值的函数虽然会返回一个值,但是也可以不使用变量去接收它,所以会导致混淆,系统无法区分究竟需要调用哪个函数。

void Swap(int* pa, int* pb)
{
	cout << "void Swap(int* pa, int* pb)" << endl;
}
int Swap(int* pa, int* pb)
{
	cout << "int Swap(int* pa, int* pb)" << endl;
}

(2)与缺省参数结合

下面例子中的func函数也不构成重载关系,原因同样是调用歧义。

void func()
{
	;
}

void func(int a = 10)
{
	;
}

int main()
{
	func();
	return 0;
}

二、引用

引用,就是给一个已存在的变量取一个“别名”。编译器不会为这个引用变量开辟新的空间,它和它引用的变量共用同一块内存空间。

int a;
int& b = a;
int& c = a;
int& d = b;

可以给同一个变量取多个别名,也可以给别名再取别名。

b和c就是变量a的别名,d是引用变量b的别名。b、c、d本质上都是a的别名,他们的地址都和a保持一致。

引用变量的类型是 int& ,本质还是原先的变量,所以可以运用到函数传参当中:

void func(int& m, int& n)
{
	int tmp = m;
	m = n;
	n = tmp;
}

int main()
{
	int x = 1, y = 0;
	func(x, y);
	printf("%d %d\n", x, y);
	return 0;
}

可以看到函数成功交换了x和y变量的值。

我们知道普通的传值调用是不会改变实参的值的,因为形参是实参的一份临时拷贝,形参和实参分别在不同的内存空间上,所以对形参的改变,并不会影响到实参。而通过引用,给实参取别名的方式,可以让形参称为实参的别名,这样,由于形参和实参共用了同一块内存空间,形参也就是实参,所以对形参的修改,也就成了对实参的修改,进而实现了上面例子中,对x、y变量的交换。

别名的这个特点,就使它有了许多指针的色彩,在许多情况下,可以用取别名的方式,来代替指针。

引用在定义的时候必须初始化,并且一旦指定了被引用的变量,就不可以再更换。

第9行的含义是把b变量的值赋给x变量,也就是a变量,而不是给x重新指定被引用的变量。

我们知道,在C语言中,如果用const修饰一个变量后,这个变量是不可以被直接改变值的,而我们可以通过使用指针,来由地址间接的去修改这个变量的值。然而在C++中,我们可不可以使用这样的方法改变被const修饰的变量的值,也不可以通过给它取别名,来改变它的值。

int main()
{
	const int a = 1;
	int* pa = &a;
	return 0;
}

int main()
{
	const int a = 1;
	int& y = a;
	return 0;
}

int main()
{
	const int a = 1;
	const int& y = a;
	y = 1;
	return 0;
}

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

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

相关文章

C#(C Sharp)学习笔记_多态【十九】

前言 个人觉得多态在面向对象编程中还比较重要的&#xff0c;而且不容易理解。也是学了一个下午&#xff0c;才把笔记写得相对比较完善&#xff0c;但仍欠缺一些内容。慢慢来吧…… 什么是多态&#xff1f; 基本概念 在编程语言和类型论中&#xff0c;多态&#xff08;Poly…

2024最新版Node.js下载安装及环境配置教程(非常详细)

一、进入官网地址下载安装包 官网&#xff1a;Node.js — Run JavaScript Everywhere 其他版本下载&#xff1a;Node.js — Download Node.js (nodejs.org) 选择对应你系统的Node.js版本 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xf…

OpenGL Super Bible 7th-Primitives, Pipelines, and Pixels图元、渲染管线与像素

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

从0进入微服务需要了解的基础知识

文章目录 系统架构演化过程为什么要了解系统架构的演化过程技术发展认知技术选型与创新 演变过程单体架构分层-分布式集群微服务 分布式\集群\微服务 微服务中的核心要素-拆分原则项目拆分与复杂度微服务的拆分维度有哪些小结 微服务中的核心要素服务化进行拆分后一定是微服务&…

MFC扩展库BCGControlBar Pro v35.0新版亮点:重新设计的工具栏编辑器等

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

ChatGPT付费创作系统V3.0.2独立版 WEB+H5+小程序端 (H5端界面美化+Pika视频作品广场+SunoAI 文生歌)系统部署教程

播播资源GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;无限…

MinIO Enterprise Cache:实现超性能的分布式 DRAM 缓存

随着计算世界的发展和 DRAM 价格的暴跌&#xff0c;我们发现服务器配置通常配备 500GB 或更多的 DRAM。当您处理大型部署时&#xff0c;即使是那些具有超高密度 NVMe 驱动器的部署&#xff0c;这些服务器上的服务器数量乘以 DRAM 也会迅速增加&#xff0c;通常达到几 TB。该 DR…

【Intel CVPR 2024】通过图像扩散模型生成高质量360度场景,只需要一个语言模型

在当前人工智能取得突破性进展的时代&#xff0c;从单一输入图像生成全景场景仍是一项关键挑战。大多数现有方法都使用基于扩散的迭代或同步多视角内绘。然而&#xff0c;由于缺乏全局场景布局先验&#xff0c;导致输出结果存在重复对象&#xff08;如卧室中的多张床&#xff0…

Android网络性能监控方案 android线上性能监测

1 Handler消息机制 这里我不会完整的从Handler源码来分析Android的消息体系&#xff0c;而是从Handler自身的特性引申出线上卡顿监控的策略方案。 1.1 方案确认 首先当我们启动一个App的时候&#xff0c;是由AMS通知zygote进程fork出主进程&#xff0c;其中主进程的入口就是Ac…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本&#xff0c;依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、灰度图 /// &…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 内存访问热度分析(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Proteus8.13安装及使用

Proteus安装包下载地址 具体安装方法如下&#xff1a; 退出所有杀毒软件,右键以管理员身份运行 如果缺插件安装插件然后点击安装 如果遇到这种需要勾选的都勾选 安装插件完成 安装过程: 安装完成后桌面会自动出现图标 注意这个安装包是免破解的, 安装好以后可以直接使用 打…

竞赛选题 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

React+TS前台项目实战(十一)-- 全局常用组件提示语可复制Link组件封装

文章目录 前言HighLightLink组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇讲的这个组件&#xff0c;是一个用于高亮显示文本并添加可选的跳转链接&#xff0c;提示文本&#xff0c;复制文本的 React 组件 HighLightLink组件 1. 功能分析 &#x…

SmartEDA、Multisim、Proteus大比拼:电路设计王者之争?

在电路设计领域&#xff0c;SmartEDA、Multisim和Proteus无疑是三款备受瞩目的软件工具。它们各自拥有独特的功能和优势&#xff0c;但在这场电路设计王者的竞争中&#xff0c;谁才是真正的领跑者&#xff1f;让我们深入探究这三款软件的异同&#xff0c;揭示它们各自的魅力所在…

【ComfyUI】Stable Diffusion 3 加Controlnet

基于 instantX-research/diffusers_sd3_control: &#x1f917; Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch and FLAX. (github.com) 和 ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers: ComfyUI SD3-Medium ControlNet&#…

JRebel-JVMTI [FATAL] Couldn‘t write to C:\Users\中文用户名-完美解决

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 热部署下载参考博客解决第一步第二步第三步&#xff1a;第四步&#xff1a; 热部署下载 下载后启动报错&#xff1a;JRebel-JVMTI [FATAL] Couldn’t write to C:\…

WebSocket实现消息实时通知

参考文档&#xff1a;万字长文&#xff0c;一篇吃透WebSocket&#xff1a;概念、原理、易错常识、动手实践、WebSocket 教程 1 背景 有一个需求&#xff0c;需要实现实时通信的功能&#xff0c;如果有新消息&#xff0c;后端会主动发送请求告知前端有新消息&#xff0c;需要前…

git Fork或者git clone克隆别人的项目到自己的仓库如何保持原仓库同步

一、问题描述 有时候我们会clone别人的项目到自己的仓库来进行二次开发,开发好之后提交到自己的仓库&#xff0c;如有原仓库有更新了,可以选择性的进行同步 二、解决方法 这里以ruoyi-vue-pro得前端项目来进行演示&#xff0c;创建一个目录&#xff0c;在目录下随便创建一个文…

入门Rabbitmq

1、什么是消息队列 消息队列&#xff1a;应用之间传递消息的方式&#xff0c;允许应用程序异步发送和接收消息&#xff0c;不需要连接对方 消息&#xff1a;文本字符串&#xff0c;对象.... 队列&#xff1a;存储数据。先进先出 2、应用场景 ①库存系统挂掉之后 MQ会等待&…