【C / C++】引用和函数重载的介绍

1.引用

概念:引用就是给已经创建好的变量取一个别名,并不是开辟出一块空间给我们新取的别名,而是和原来的变量使用同一个空间,只是换了一个名字。他有点像我们的外号。外号仍然表示的是我们。但是他和我们的名字不完全一致。

使用格式:(数据类型)& 引用名 = 引用对象

通过这里我们可以看到 ra 其实就是 a 本身,只是换了一个名字,它不仅数据一样,它存储的地址也是一样的。

注意:**创建引用变量的时候是必须要进行初始化的。**这个问题大家其实很容易可以想得明白,我既然是创建另外一个变量的别名,那我肯定要让编译器知道那个变量本身是谁。

此外还有一个特性是变量可以有多个引用,但是引用体本身一旦引用了一个变量,便无法再引用其他变量

最后一个特性,不知道大家猜到没有?引用体的值的改变是会影响变量本身的,有前面的地址一致的铺垫,这个特性其实不算难猜了。毕竟计算机对你创建的变量的所有了解,也仅储存在这个地址当中了。

cpp 复制代码
int main()
{
	int a = 3;
	int& ra = a;
	ra = 4;
	cout << a << endl; //输出4 
	return 0;
}

1.1 引用调用

学了这个知识,大家可能会感到有些疑惑,我变量名称的使用又没有次数限制,为什么要弄出一个概念来给我的变量取一个外号呢?**这有什么好处?它发挥着怎么样的作用?**那我在这里就介绍其中的一种。

我们在写代码的时候可能会经常性的运用到一些。执行特定功能的封装函数,我们在调用这些封装函数的时候就需要传值。在传值的时候,我们既可以选择常规的在主函数内部传递时用实参。再用形参接收,也可以运用这里学到的引用调用。

cpp 复制代码
add(int& x, int& y)
{
	return x + y;
}
int main()
{
	int a = 3;
	int b = 4;

	int s1 = add(a, b);
	cout << s1 << endl;
	return 0;
 } 

那这样做的好处有哪些?好处有两个点

第一点:我们通过引用调用的方式,**可以在封装函数内部去改变我们这个变量本身的值,**使得我们在写代码的时候更加的灵活。

另外一个好处就是它的运行效率会更高,这个也很容易理解,毕竟不用编译器单独开辟一块空间,创建一个变量。肯定是能够提高效率的。也许在调用次数不多的情况下,并不会表现出明显的差异。但在需要大量调用函数的情况,这个特点便显得尤为可贵这个特点就显的尤为可贵。

cpp 复制代码
#include<iostream>
#include<string>
#include<ctime>
using namespace std;

int z = 2;
void consume_sc(int z) {}  //实参传值 
void consume_yy(int& rz) {} //引用调用 

void test()
{
	size_t begin1 = clock(); //记录开始时间 (实参) 
	for(int i = 0; i < 10000000; i++)
	{
		consume_sc(z);
	}
	size_t end1 = clock();   //结束时间 
	
	size_t begin2 = clock(); // (引用) 
	for(int i = 0; i < 10000000; i++)
	{
		consume_yy(z);
	}
	size_t end2 = clock();
	
	cout << "实参传值花费的时间" << end1 - begin1 << endl;
	cout << "引用调用花费的时间" << end2 - begin2 << endl;
}

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

这段代码是用来验证引用调用的,运行效率会高于去传实参。当然,如果你运行这段代码,你可能不会感受到很明显的区别,其实原因是在于我在这里没有让函数去执行任何的操作,仅仅是传递了一个整型参数。只要代码稍微复杂一点,哪怕你只是传了一个字符串,差距都会很明显

引用调用还能用来传字符串吗?是的,可以的。其实引用调用可以用来传各种各样的参数,包括string 定义的字符串。

2.函数重载

大家最想一个这样的场景,你进入一个公司去当程序员,这个公司原来的程序员写了各种各样的函数,我们可以在使用的时候直接通过名称去调用它们,以方便我们去写代码,像加法、减法、乘法、除法这些很简单的。然后因为这个公司存在了很长时间,所以这里的程序员就给各种各样,使用频率稍高一些的功能都封装成了一个函数,那你刚进入这个公司,难道你需要先去把你前辈们留下来的各种各样的函数全部去记下来吗?

你可能没有概念,我拿加法举例子,大家知道计算机在处理的时候,它要先知道你数据的类型,才能去执行特定操作,那加法就分为整数加法和浮点数加法,甚至还有字符的加法。如果你需要把它们全部记下来,是不是会太麻烦了些呢?

那 C++中有一个概念就很完美的解决了这个问题,那就是函数重载。

概念:函数重载是指在同一个作用域中可以有多个同名函数,它们的名称相同,但是参数列表不同。

作用域: 它其实可以被你理解为你的编译器中的一个项目,即使它不仅于此,初学者有这个理解便够用了

这里的不同包括:参数的数量,顺序,类型中至少有一个不同。返回类型不被计算在内,因为 C++不会根据返回类型来区分不同的函数。

cpp 复制代码
int add(int a, int b)
{
	return a + b;
}
double add(double a, double b)
{
	return a + b;
}
int main()
{
	int a = 3, b = 4;
	double c = 1.3, d = 2.3;
	int s1 = add(a, b);
	double s2 = add(c, d);
	cout << s1 << ' ' << s2 << endl;
}

如果你觉得没有理解上一段话,你可以看一这段代码。这就很好的展现了,编译器会根据你的函数名参数列表共同去区分不同的函数,去选择他应该执行哪个函数

相关推荐
机器视觉的发动机2 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经2 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
R_.L2 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan2 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
我在人间贩卖青春2 小时前
C++之this指针
c++·this
云姜.2 小时前
java多态
java·开发语言·c++
CoderCodingNo3 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳10303 小时前
C++:红黑树
开发语言·c++
VekiSon3 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件