C++:函数重载和引用

news2024/11/18 20:40:00

hello,各位小伙伴,本篇文章跟大家一起学习C++:函数重载和引用,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 !

文章目录

  • 函数重载
    • 1.函数重载的概念
    • 为什么C++支持函数重载
  • 引用
    • 引用的概念
    • 引用特性
    • 引用的使用场景
      • 1.做参数
      • 2.做返回值
    • 传值、传引用效率比较
    • 引用和指针的区别

函数重载

1.函数重载的概念

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

要注意是同一作用域,不同作用域可以同名,但是不属于函数重载

1.参数个数不同:

void f(int a)
{
	printf("%d\n",a);
}
void f(int a,int b)
{
	printf("%d %d\n",a,b);
}

2.参数类型不同:

void f(int a,int b)
{
	printf("%d %d\n",a,b);
}
void f(double a,double b)
{
	printf("%lf %lf\n",a,b);
}

3.参数类型顺序不同:

void f(int a,char b)
{
	printf("%d %c\n",a,b);
}
void f(char b,int a)
{
	printf("%d %c\n",a,b);
}

在函数重载时要注意可能会发生分歧,例如:

#include<iostream>
using namespace std;

void f(int a)
{
	cout<<a<<endl;
}
void f(char a)
{
	cout<<a<<endl;
}
int main()
{
	int a = 1;
	f(a);
	return 0;
}

上述代码会报错,因为编译器不知道要调用哪一个f()函数,在传参时a可以隐式转换为char类型,这样就发生了分歧。

为什么C++支持函数重载

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
举个例子,a.cpp调用b.cpp中的Add()函数,那么链接器看到a.o调用Add()函数,但没有地址时,就会在去b.o寻找Add()的地址,然后链接在一起。
a.o、b.o分别为a.cpp、b.cpp预处理、编译、汇编后得到的文件

那么链接器怎么去找呢?
C++会使用已经修饰过的了Add()函数去寻找,怎么修饰与编译器有关,而C语言会直接使用Add这个函数名去寻找,那么两个一模一样的函数名,自然会发生分歧,使得编译器不知道走哪一个。

总的来说C++在链接时,会使用已经修饰过的函数名去寻找地址,函数参数个数不同、参数类型不同、参数类型顺序不同,修饰后的函数名自然不同,从而不会发生分歧。

!!!知道了为什么支持函数重载后,还有一点细节:返回值不同,构成函数重载吗?
答案是:不支持

如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办
法区分。

引用

引用的概念

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

举个例子:陈明的别名是小明,但是小明就是陈明,指的是同一个人。
使用:类型& 引用变量名(对象名) = 引用实体;
例子:

int main()
{
	int a = 1;
	int& b = a;
  //   int       &   	b 	    =      a;
  //(引用类型)  &  (引用变量)	=  (引用实体)
	b = 3;
	cout<<a<<endl;
	printf("%p\n",&a);//表达式1
	printf("%p\n",&b);//表达式2
	return 0;
}

猜猜a的值为多少?没错,答案是3。
前面讲到,它和它引用的变量共用同一块内存空间,所以b指的就是ab的值改变,那么a当然会变,所以表达式1表达式2打印的结果一样,都是同一个地址。
在这里插入图片描述
注意:引用类型必须和引用实体是同种类型的
相信小伙伴们就能很容易理解,那么细节来了:

int main()
{
	const int a = 1;
	int& b = a;

	return 0;
}

这么些是否正确呢?相信聪明的小伙伴们一眼就看出答案:这么些是错误的。
const修饰a,那么a是不能改变的,而b并没有const修饰,所以b可以改变,也就是权限被放大了,本来a自身都不能改变,凭什么b可以。
再来:

int main()
{
	int a = 1;
	const int& b = a;

	return 0;
}

这么写b不能改变,a可以,权限被缩小,是可以的。
继续:

int main()
{
	int a = 1;
	const int* pa = &a;
	int*& b = pa;

	return 0;
}

很明显,这么写是错的,权限被放大了。
那么这个:

int main()
{
	int a = 1;
	int* const pa = &a;
	int*& b = pa;

	return 0;
}

这么写是正确的。

这两个声明之间存在重要的区别,这涉及到C++中指针和const关键字的使用。

  1. int* const pa = &a;

    • 这里 pa 是一个指针,它指向一个整数(int*)。
    • 关键字 const 出现在 * 前面,表示指针本身是常量,即指针一旦指向了某个地址之后,就不能再指向其他地址。
    • 也就是说,pa 是一个常量指针,它的值(即指向的地址)不可以被改变,但是它所指向的值可以被修改。
  2. const int* pa = &a;

    • 这里 pa 是一个指向常量整数的指针。
    • 关键字 const 出现在 int 前面,表示指针所指向的值是常量,即不能通过 pa 修改所指向的值。
    • 也就是说,pa 是一个指针,它可以指向任意整数,但通过 pa 只能读取所指向的值,而不能修改。

总结来说,int* const pa = &a; 表示 pa 是一个指针常量,而 const int* pa = &a; 表示 pa 是一个指向常量整数的指针。

引用特性

  1. 引用在定义时必须初始化(你总不能想到一个别名先放着,看到谁就给谁用吧)
int& a;//这么些是错的
  1. 一个变量可以有多个引用
int a = 1;
int& b = a;
int& c = a;
int& d = a;
  1. 引用一旦引用一个实体,再不能引用其他实体
int a = 1;
int& b = a;
int c = 1;
b = c;//这么些是错的

引用的使用场景

1.做参数

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
int main()
{
	int a = 1;
	int b = 2;
	int& c = a;
	int& d = b;
	Swap(c,d);
	return 0;
}

2.做返回值

int& Test1()
{
	int n = 0;
	n++;
	return n;
}

int main()
{
	int a = 0;
	int& b = a;
	b = Test1();
	cout << a;
	return 0;
}

传值、传引用效率比较

我们知道:

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

所以,传引用的效率比传值的效率更高,引用作为返回值比值作为返回值效率更高。

引用和指针的区别

语法概念上,引用是没有独立空间的,他就是引用实体的另一个名字,和其引用实体共用同一块空间。

int main()
{
 int a = 10;
 int& ra = a;
 
 cout<<"&a = "<<&a<<endl;
 cout<<"&ra = "<<&ra<<endl;
 return 0;
}

底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{
 int a = 10;
 
 int& ra = a;
 ra = 20;
 
 int* pa = &a;
 *pa = 20;
 
 return 0;
}

我们来看其汇编代码对比指针和引用
在这里插入图片描述
可以看出操作上是一样的。

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
    一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

好啦,这篇文章就到此结束了
所以你学会了吗?

好啦,本章对于C++:函数重载和引用的学习就先到这里,如果有什么问题,还请指教指教,希望本篇文章能够对你有所帮助,我们下一篇见!!!

如你喜欢,点点赞就是对我的支持,感谢感谢!!!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中发送HTTP请求的方式

一&#xff0c;简介 使用C编程发送HTTP请求通常需要使用第三方的HTTP库或框架。在C中&#xff0c;有几个受欢迎的HTTP库可供选择&#xff0c;例如Curl、Boost.Beast和cpp-httplib。另外&#xff0c;也可以自己实现socket来发送http请求 二、使用Curl库发送HTTP请求 1. 确认当…

day60 动态规划part17

这两题看了自己写的笔记还不懂的话&#xff0c;看看这个up的思路就行&#xff1a; https://space.bilibili.com/111062940/search/video?keyword%E5%9B%9E%E6%96%87 647. 回文子串 中等 提示 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回…

微带线特性阻抗快速计算---根据介质板参数和特性阻抗得到线宽(Matlab代码)

微带线特性阻抗快速计算—根据介质板参数和特性阻抗得到线宽&#xff08;Matlab代码&#xff09; 参考&#xff1a;https://blog.csdn.net/weixin_45811090/article/details/130045689 《射频电路理论与设计》第2版 黄玉兰著 《射频电路设计——理论与应用》第二版 Reinhold L…

STC89C51学习笔记(三)

STC89C51学习笔记&#xff08;三&#xff09; 综述&#xff1a;本文讲述了通过51单片机控制LED闪烁、流水灯、按键控制LED亮灭、按键控制LED实现二进制、按键控制LED左右移。 一、LED 1.LED闪烁 1&#xff09;原理 如果要实现LED闪烁&#xff0c;不可以直接先使LED亮&…

兼顾性能的数据倾斜处理方案

目录 前言 一、场景描述 二、常见的优化方法 2.1 Mapjoin 2.2 特殊值/空值打散 2.3 热点值打散&#xff0c;副表呈倍数扩散 2.4 热点数据单独处理/SkewJoin 2.5 方案总结 三、Distmapjoin 3.1 核心思路 3.2 代码实现 3.3 真实效果 四、方案总结 文章主要是介绍在支…

手把手教你从入门到精通C# MES通信

前言 我们在上位机软件开发的时候,经常需要与客户的MES系统进行通信,一般与MES系统通信需要实现的功能如下: 1、通过输入员工号来获取登录MES系统的权限 2、上传设备检测的OK/NG结果给MES系统; 3、上传设备生产过程中的异常信息给MES系统; 4、上传设备生产过程中的数据,…

(arxiv2401) CrossMAE

作者团队来自加州大学伯克利分校&#xff08;UC Berkeley&#xff09;和加州大学旧金山分校&#xff08;UCSF&#xff09;。论文主要探讨了在MAE的解码中&#xff0c;图像patch之间的依赖性&#xff0c;并提出了一种新的预训练框架 CrossMAE。 论文的主要贡献包括&#xff1a; …

【C++入门】关键字、命名空间以及输入输出

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Ant Design Vue table固定列失效问题解决

问题描述&#xff1a;项目中封装好的公共table组件&#xff0c;基于Ant Design Vue table封装&#xff1b;使用中&#xff0c;用到了列固定&#xff0c;但是没生效&#xff0c;找了好久的原因。。。最后是因为外层容器标签导致&#xff1b; 解决方法&#xff1a;如果a-table组件…

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-AwzyR2lkHKjD9HYl {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【吊打面试官系列】Redis篇 - Redis单进程单线程好处?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis单进程单线程好处&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis单进程单线程好处&#xff1f; 代码更清晰&#xff0c;处理逻辑更简单 不用去考虑各种锁的问题&#xff0c;不存在加锁释放锁操作&…

使用简单MLP实现0-9数字识别,数据集为MNIST

简介 需求&#xff1a; 基于pytorch实现简单MLP&#xff0c;完成数字识别&#xff0c;采用MNIST手写数字作为数据集&#xff0c;MNIST&#xff1a;有6万张训练图片&#xff0c;1万张测试图片训练结束后&#xff0c;随机取3张测试图片&#xff0c;展示模型的预测结果和真实图片…

策略模式图

策略模式 小小的图解 主要的三个角色 Strategy—抽象策略角色ConcreateStrategy—具体策略角色Context—上下文角色 封装了对具体策略的调用可以使用set的依赖注入也可以使用构造方法 核心是上下文角色 只要调用上下文角色就行&#xff0c;实现解耦 策略 工厂 将上下文角…

【java探索之旅】逻辑控制掌握 顺序结构 分支语句

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、逻辑控制的概念二、顺序结构三、分支结构3.1 if语句3.2 if习题巩固3.3 细节注意项…

TR3 - Transformer算法详解

目录 文本输入处理词向量位置向量 编码器 EncoderSelf-Attention多头注意力机制残差连接 解码器 Decoder线性层与Softmax损失函数总结与心得体会 这周来看一下Transformer是怎么将文本转换成向量&#xff0c;然后又输入到模型处理并得到最终的输出的。 文本输入处理 词向量 …

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

2024-04-05 问AI: 介绍一下深度学习中的Leaky ReLU函数

文心一言 Leaky ReLU&#xff08;Leaky Rectified Linear Unit&#xff09;函数是深度学习领域中的一种激活函数&#xff0c;主要用于解决ReLU&#xff08;Rectified Linear Unit&#xff09;函数在负值区域为零的问题。ReLU函数在输入为正时保持原样&#xff0c;而在输入为负…

Navicat工具使用

Navicat的本质&#xff1a; 在创立连接时提前拥有了数据库用户名和密码 双击数据库时&#xff0c;相当于建立了一个链接关系 点击运行时&#xff0c;远程执行命令&#xff0c;就像在xshell上操作Linux服务器一样&#xff0c;将图像化操作转换成SQL语句去后台执行 一、打开Navi…

Python学习: 错误和异常

Python 语法错误 解析错误(Parsing Error)通常指的是程序无法正确地解析(识别、分析)所给定的代码,通常是由于代码中存在语法错误或者其他无法理解的结构导致的。这可能是由于缺少括号、缩进错误、未关闭的引号或其他括号等问题造成的。 语法错误(Syntax Error)是指程序…

CSS设置网页颜色

目录 前言&#xff1a; 1.颜色名字&#xff1a; 2.十六进制码&#xff1a; 3.RGB&#xff1a; 4.RGBA&#xff1a; 5.HSL&#xff1a; 1.hue&#xff1a; 2.saturation&#xff1a; 3.lightness&#xff1a; 6.HSLA&#xff1a; 前言&#xff1a; 我们在电脑显示器&…