2.C++入门2(函数重载与引用)

news2024/11/26 12:50:06

⭐本章主要介绍c++中的函数重载,重载的原理,和引用(参数引用,返回值引用)

⭐本人c++代码的Gitee仓库:c++学习 · 橘子真甜/yzc的c++学习 - 码云 - 开源中国 (gitee.com)

一.函数重载 

 1.1 什么是函数重载

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

举例:

//个数不同
int f1(int a)
{
	return a;
}

int f1(int a, int b)
{
	return a + b;
}
//类型不同
int f2(int a, int b)
{
	return a + b;
}

int f2(double a, double b)
{
	return a + b;
}
//顺序不同
int f2(int a, float b)
{
	return a + b;
}

int f3(float a, int b)
{
	return a + b;
}

当调用具有同名函数的函数时候,编译器会根据传入的参数去适配对应的函数。从而达到一种多态的效果。

举例:

#include<iostream>
using namespace std;

//类型不同
int f2(int a, int b)
{
	return a + b;
}

double f2(double a, double b)
{
	return a + b;
}

int main()
{
	double x = f2(1.5, 2.5);
	int y = f2(1, 2);
	cout << "x:" << x << " y:" << y << endl;
	return 0;
}

可以看出x的f2调用了 参数是double的f2,而y调用了参数是int的f2

1.2 C++支持函数重载的原理

        为什么c++支持函数重载,而c语言不支持呢?

        这是因为C++是通过函数修饰规则来区分,只要函数的参数不同,c++编译的时候就会根据参数的不同而修改函数的名称,这样就能够区分同命不同参的函数。

        而C语言同名函数无法区分。

解释:

        在linux下查看编译后函数的名称

这也解释了:函数名称和函数参数相同,返回值不同的函数无法构成重载。

因为它们的函数名称在修饰之后仍是一样的!

1.3 函数重载总结

函数重载:

1.函数名相同        2.参数不同        3.返回值没有要求

二.引用

        引用是给已有变量取别名,不是新定义变量。引用变量和被引用的变量共用同一块内存空间。

例:

#include<iostream>
using namespace std;

int main()
{
	int a = 123;
	int& b = a;
	cout << "a=" << a << "  b=" << b << endl;
	//输出a和b的地址进行观察
	printf("a:%p\n", &a);
	printf("b:%p\n", &b);
	return 0;
}

 

         这说明,b就是a。只不过取了另外一个名字。

2.1 引用的特性

1.  引用在定义的时候必须初始化。(要给出引用的对象)

不初始化会报错

2. 同一个变量可以有多个不同的引用。

3. 引用一旦引用一个实体,就不能再引用其他实体。

c=x,只是将x赋值给c。不是引用改变。

可以看出c=x之后,a的值也改变了

2.2 常引用

        使用 const 关键字就能够使用常引用。

观察下面代码

可以看出,a1是a的常引用。而b1却报错了。这是为什么呢?

这是由于b是常量,而b1引用的时候确实普通变量。如果b1修改了,那么常量b也会修改。

这就不合理了。

所以:

引用取别名的时候不能够放大变量的访问权限,访问权限可以缩小,不能放大。

2.2 引用的使用场景

1. 作为函数的参数

void swap(int& a, int& b)
{
	int t = a;
	a = b;
	b = t;
}

2. 作为函数的返回值

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

注意:引用作为函数的返回值时候,不能返回函数里的局部变量!这么做是不安全的

举例:

#include<iostream>
using namespace std;

int& add(int x, int y)
{
	int sum = x + y;
	return sum;
}
int main()
{
	int& a = add(1, 2);
	add(3, 5);
	cout << a;
	return 0;
}

运行结果: 

 可以看出由于再次调用 add(3,5) ,导致a的值改变。

编译器也给出了warning,返回局部变量或者临时变量的地址

如果函数返回的时候,出了函数作用域,如果返回对象还在(没有被系统收回,如静态变量,全局变量),则可以使用引用返回。否则,不可使用引用返回。

2.3 传值,传引用效率比较 

        当传值返回,传值做参数的时候。函数不会直接传递实参,或者将变量直接返回,而是传入,或者返回变量的临时拷贝。所以使用传值当参数或者返回的时候,效率较低。

         所以当我们可以使用引用返回或者做参数的时候,尽量使用引用,以提高效率。

2.4 引用,指针的区别

1.引用是变量的别名,共用同一块空间。        指针是变量的地址,通过地址进行修改变量

2.引用必须初始化。        指针没有要求

3.引用变量引用一个实体后,不能引用其他实体        指针可以指向其他变量的地址

4.没有NULL引用        有NULL指针

5.sizeof(引用) 的后果是被引用变量的大小        sizoef(指针)在32位下是4,64位下是8

6.引用++让原变量+1,指针++会指向原地址向后偏移一位的地址

7.有多级指针,没有多级引用

8.指针需要解引用才能访问变量,        引用编译器自动处理

9.引用相对指针更安全

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

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

相关文章

使用OpenCore Auxiliary Tools(OCAT)为黑苹果生成三码

文章目录 基础知识apple三码常用工具OCAT 操作方法配置正确的open core版本一键生成 验证 基础知识 apple三码 苹果的生态是一套完整的闭环&#xff0c;每一个苹果硬件产品都有独一无二的 SMBIOS ID&#xff08;机型 ID&#xff09;&#xff0c;机型 ID 决定序列号、主板序列号…

遥感技术在生态系统碳储量、碳收支、碳排放、碳循环以及人为源排放反演等领域的技术发展,实践角度解决遥感技术在生态、能源、大气等领域的碳排放监测及模拟问题

卫星遥感具有客观、连续、稳定、大范围、重复观测的优点&#xff0c;已成为监测全球碳盘查不可或缺的技术手段&#xff0c;卫星遥感也正在成为新一代 、国际认可的全球碳核查方法。本教程的目的就是梳理碳中和与碳达峰对卫星遥感的现实需求&#xff0c;系统总结遥感技术在生态系…

I 农产品如何实现全链路追踪?区块链、非中心化数据库的应用

大家好啊&#xff0c;我是豆小匠。 本期作为区块链技术分享的第一期&#xff0c;和大家分享下区块链在现实生活中的应用。 区块链的场景 说起区块链&#xff0c;大家可能比较陌生&#xff0c;但是说比特币估计都有耳闻。 但是作为一项技术&#xff0c;区块链的应用远不止于此…

mysql Field ‘ssl_cipher‘ doesn‘t have a default value的解决

1、执行sql的时候报错&#xff1a; 16:48:00 INSERT INTO mysql.user (Host,User,authentication_string) VALUES(%,root, PASSWORD(12323)) Error Code: 1364. Field ssl_cipher doesnt have a default value 0.000 sec 1、解决&#xff0c;执行命令&#xff1a; my…

Linux 操作系统 进程(2)

上篇文章我们说过的操作系统进程的概念等&#xff08;Linux 操作系统 进程&#xff08;1&#xff09;-CSDN博客&#xff09;&#xff0c;这篇我们就来了解进程最重要最直观的两个状态 &#xff1a; 进程状态 进程优先级 进程状态 kill命令 我们在查询进程的时候就可以看到当前…

港股通“大洗牌”,这是一场“双赢”还是一次“交易”?

最近的资本市场&#xff0c;可谓是“一石激起千层浪”。先有阿里完成香港双重主要上市&#xff0c;随后港股通进行“大洗牌”。 9月9日&#xff0c;上交所、深交所发布公告&#xff0c;阿里巴巴-W&#xff08;09988.HK&#xff09;、茶百道(02555.HK)、云音乐(09899.HK)、顺丰…

YB5090是一款 5V USB 输入,支持双节串联锂电池或锂离子电池的升压充电管理 IC

适用于TYPE-C接口,集成30V OVP功能 , 最大1.8A充电电流,带NTC及使能功能,双节锂电升压充电芯片 概述&#xff1a; 是一款 5V USB 输入&#xff0c;支持双节串联锂电池或锂离子电池的升压充电管理 IC。集成有 NTC 功能&#xff0c;其最大的充电电流可达 1.8A。 集成功率MOS,采用…

架构师备考的一些思考(二)

前言 以我的视野来看&#xff0c;部长或技术总监这种岗位还是比较难竞争的&#xff0c;换言之&#xff0c;程序员的上升空间比较窄&#xff0c;如果想要拿到高级岗位&#xff0c;最好的是工作三五年后就转项目经理&#xff0c;然后再往上爬。 架构师倒是也能晋升高级岗位&#…

git的快速合并fast-forward merge详解

文章目录 1. 什么是快进合并&#xff1f;2. 快进合并的前提条件3. 快进合并的工作原理3.1 示例场景&#xff1a;3.2 使用命令&#xff1a;3.3 快进合并的视觉效果&#xff1a; 4. 快进合并的优点5. 快进合并的缺点6. 快进合并 vs 非快进合并6.1 非快进合并&#xff1a;6.2 非快…

Promise详解、自定义

这里写目录标题 一、.Promise对象详解1. Promise是什么2. Promise的优点3. 异步编程4. then(onFulfilled, onRejected)&#xff1a;5. util.promisify 方法&#xff1a;6. promise的状态改变7.Promise 对象的值8. Promise的基本执行流程9. Promise的API10. Promise中的关键问题…

怎样训练一个自己的大语言模型?这可能是全网最简单易懂的教程!

Llama 2 是来自 Meta 的第二代开源LLM的集合&#xff0c;旨在处理各种自然语言处理任务&#xff0c;模型的规模从 7B&#xff08;70亿&#xff09;到 70B&#xff08;700亿&#xff09;个参数不等&#xff0c;可以商用。 Llama-2-Chat 针对对话进行了优化&#xff0c;显示出与…

你们准备好了吗?Python 入行 AI 的基础技术栈及学习路线

人工智能&#xff08;AI&#xff09;是当今技术发展的重要领域之一&#xff0c;而 Python 已成为 AI 领域的首选编程语言之一。Python 简单易学&#xff0c;具有丰富的生态系统和社区支持&#xff0c;特别是在 AI 和机器学习&#xff08;ML&#xff09;领域有大量强大的库和框架…

电商系统源码开发中的卷轴模式系统:当前技术面临的问题

随着互联网技术的飞速发展&#xff0c;电商系统已成为数字经济的重要组成部分。为了提升用户体验和平台活跃度&#xff0c;卷轴模式作为一种创新的用户参与机制&#xff0c;逐渐在电商系统中崭露头角。然而&#xff0c;在电商系统源码开发卷轴模式系统的过程中&#xff0c;仍面…

‌汽车的舒适进入功能是什么意思?

移动管家汽车的舒适进入系统是指无钥匙进入功能&#xff0c;它允许驾驶者在距离车辆一定范围内自动感应解锁车辆&#xff0c;并具备无钥匙启动功能‌。舒适进入系统的核心优势包括&#xff1a; ‌智能化操作‌&#xff1a;无需传统钥匙&#xff0c;通过智能感应实现车门解锁和…

@Transactional和@Synchronized的冲突

Transactional和Synchronized的冲突 场景 方法是先进行检查&#xff0c;然后新增&#xff0c;添加了事务注解&#xff0c;为了保证检查&#xff08;要求业务上唯一&#xff09;&#xff0c;添加了Synchronized注解 想法很简单&#xff0c;事务注解保证方法原子性&#xff0c…

基于Kithara实时套件的EtherCAT主站

第1章 Kithara实时套件概述 1.1 概述 Kithara Software是一家德国的软件公司&#xff0c;专注于实时技术和嵌入式解决方案。 他们为Windows操作系统提供了Kithara RealTime Suite&#xff0c;这是一套实时扩展模块&#xff0c;使Windows能够实现硬实时任务和控制。 Kithara R…

C++实现宏编译不同版本程序

1. #define的概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。 (1)简单的宏定义: #define <宏名>  <字符串…

JavaScript web API part2

web API 全选反选案例 需求&#xff1a; 勾选大复选框&#xff0c;勾选全部小复选框取消勾选大复选框&#xff0c;则取消勾选全部小复选框若有小复选框没有被勾选&#xff0c;则大复选框不被勾选若所有小复选框都被勾选&#xff0c;则大复选框被勾选 <!DOCTYPE html>…

Scratch中秋节贺卡——福满中秋

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 中秋佳节即将到来&#xff0c;小虎鲸Scratch资源站为大家特别准备了一款精美的《Scratch中秋节贺卡——福满中秋》作品&#xff0c;带您轻松制作属于自己的节日贺卡&#xff0c;为亲朋好友送上最真挚的节日…

OpenBayes 教程上新 | FLUX ComfyUI 现已上线 ,让 SD 和 Midjourney 颤抖的文生图黑马!

横空出世的黑马 FLUX &#xff0c;以其强大的图像生成能力&#xff0c;让 Stable Diffusion 和 Midjourney 这 2 个「昔日顶流」倍感压力。 FLUX 与 Stable Diffusion 渊源颇深&#xff0c;其研发公司 Black Forest Labs 的创始人 Robin Rombach 是 Stable Diffusion 的共同开…