前言 本期我们要讲的是 C++ 中的引用。
上期我们讨论了指针,如果你没有看过那期内容,你一定要回去看看,因为引用实际上只是指针的扩展,你至少需要在基本层面上理解指针是如何工作的,然后才能继续学习本期的内容,本期内容是指针那一期的链接。
P7 C++指针-CSDN博客
先了解这些
指针 和 引用 是被大量翻来覆去提及的两个关键字,在 C++ 语言和其他语言中,它们本质上是一样的。
没错,指针和引用在计算机中做的事情几乎是一样的,从语义上说,我们如何使用和书写它们,有一些细微的区别,但从根本上来讲,引用只是指针的伪装,它们只是在指针的语法糖,它可以让程序更容易阅读,更容易被理解。
01 如何使用引用
看下面这段代码
#include <iostream>
int main()
{
int data = 9;
int& XiaoMing = data; //引用,给data取个小名为XiaoMing
std::cout<<XiaoMing << std::endl;
std::cout<<data << std::endl;
std::cin.get();
return 0;
}
我有一个变量,记作 a,我让它等于 9,它是一个整数,我给这个变量创建一个引用,我可以输入变量的类型,后面跟着 & 符号,注意 & 符号实际上是变量声明的一部分。
如果你看过指针那一期,你会知道我们可以使用 & 符号获取现有变量的内存地址,这里不一样,因为 & 符号实际 不在类型旁边,它只是类型的一部分,要注意区别,因为很多人只要看到 &,就认为都是引用,或者都是取地址,其实具体是啥取决于上下文,在当前例子中,因为它在类型的旁边,所以它是一个引用。
我们继续解释代码,我将基命名为 XiaoMing, 并将其值设为 a,然后这里就不需要其他奇怪的运算符了,我们只是让它等于一个现有的变量就可以了。
我们现在创造了一个叫做 别名 的东西,因为这个 XiaoMing“变量” ,——我说的 “变量” 是带引号的,因为它不是一个真正的变量,这只是一个引用,ref 变量实际上不存在,它只存在于我们的源代码中。如果你现在编译这段代码,你不会得到两个变量 a 和 XiaoMing,你只会得到 a。
我们现在能做的是,我们可以使用 XiaoMing就像它就是 a,如果我们设 XiaoMing等于 10,然后打印 a,你会发现 a 的值变为了10。
因为 XiaoMing就是 a,我们只是给 a 起了个小名,在这种情况下,我们的引用不是一个指针或其他类似的东西,编译器不需要实际创建一个新变量,如果你编译代码,这代码就相当于你设置了 a = 10,我们就是这么做的,因为如果给变量起一个别名的话,某些情况下我们的代码逻辑会更简单一些。
02 引用的作用示例
我们定义一个函数 addNumber,让整型变量相加。你觉的下面的写法会实现这个功能吗?
#include <iostream>
void addNumber(int number1, int number2, int padd)
{
padd = number1+number2; //相加
}
int main()
{
int add = 5;
addNumber(1, 5, add);
std::cout<<add << std::endl; //打印出两数相加后的值
std::cin.get();
return 0;
}
并不能。
我们调用 addNumber函数,将 add 作为参数传递进去,你可以看到我们井没有把它作为一个指针或者引用等类似的东西传进去,它会拷贝这个值 5 复制到函数中,复制会创建一个全新的变量 padd,这就是程序中发生的事情,如果运行代码我们可以看到打印出的值还是5 。
我们需要做的是通过引用来传递变量,这样它才会递增,因为我真正想做的是影响这个变量,那么我们该怎么做呢,如何通过将这个变量传递到函数中来修改它呢?
上期我们讨论了指针,还记得指针就是我们的内存地址吧,从理论上讲,我们可以做的是,可以没有将实际值 5 传递给函数,但是可以把 a 变量的内存地址传递进去,因为我们可以在这个函数中做的是可以查找那个内存地址,然后修改那个内存地址中的值。因为我们已经将该内存地址传递给了函数, 所以我们理论上是可以这样做的,但是使用引用会更简单些。
事实上,我们只要在addNumber的padd参数修改一下,将padd变为add的小名即可
这就是我想说的关于引用的内容了,非常简单的东西