本篇将会讲C++中很重要的概念-引用,引用得概念出现的是比较晚的,引用是在C语言中没有的,但是在C++,Java等都是很常见的。
那什么是引用?引用又有什么作用呢?本篇将会进行介绍。
总结:
- 引用的使用情况:当需要改变外部内容(实参,跨作用域),使用指针需要进行地址的判断(保证不为空),为了避免指针问题,使用引用;
- 引用的本质:给外部内容起了一个别名;
- 如何定义引用:引用(左值引用)的写法:
int& refN = n;&为取地址符号; - 如何使用引用:
fool(int& n)外部函数中:int& refN=nfool(refN)或者fool(n)。
1. 形参无法改变实参值
首先看一段代码:不运行我们就知道结果,n最后还是5,这是因为foo(n)中的n是形参,是无法改变外边的n的值或者从生命周期的角度去考虑也是一样的结果。
#include <iostream>
void foo(int n)
{
n = 8;
}
int main(int argc, char* argv[])
{
int n = 5;
fool(n);
return 0;
}
运行结果:

2. 利用指针改变外部内容
如果我们需要在函数内部改变外部传来的参数,那我们会想到
利用指针来改变外部内容:
代码如下:
#include <iostream>
void foo(int* n)
{
*n = 8;
}
int main(int argc, char* argv[])
{
int n = 5;
foo(&n);
return 0;
}
运行结果:这是我们之前在C时使用的方法,此时foo(&n)不是像上边代码将形参的内容传递进来,而是把n的地址传给函数体foo(),所有foo()改变的是传递进来的地址的值,所以可以实现改变外部值的作用。

2.1 指针改变外部内容带来的问题
但是
指针会带来一些问题,指针是十分有用的,但也是十分危险的,你如果传的是指针,一定要对指针传的地址做检查。
例如对上面的代码进行更改如下:
#include <iostream>
void foo(int* n)
{
*n = 8;
}
int main(int argc, char* argv[])
{
int n = 5;
foo(nullptr);
return 0;
}
运行结果:由于传入的指针指向为空,空地址是没有分配内存的,造成崩溃,编译器只会在运行时才会发现

通过对指针是否为空的判断,可以预防上面问题的出现:
#include <iostream>
void foo(int* n)
{
if (n == nullptr)
return;
*n = 8;
}
int main(int argc, char* argv[])
{
int n = 5;
foo(nullptr);
return 0;
}
虽然上面的代码实现了指针是否为空的判断,相对安全一些,但是如果n的指针分配了内存,但是到函数调用时内存释放,还是会出现相同的情况?(不太懂)。
3. 引用的概念
上述操作其实本质是改变内容,但是地址的确定无法检查,C++从语言层级避免使用指针,从而不用确认地址。因此提出引用的概念。
- 引用(左值引用)的写法:
int& refN = n;&为取地址符号 - 引用的本质为:变量的别名
有如下代码:
#include <iostream>
int main(int argc, char* argv[])
{
int n = 5;
int& refN = n;
refN = 6;
return 0;
}
运行结果:可以看到n和refN的值都变为6

这是为什么呢?
refN引用了n的值,也就是说refN等价于n,改变refN的值等价于改变n的值。
更深层次的说这是因为n在内存中的值为5,refN同时也指向内存中的5,改变refN的值,本质上就是改变内存中值。
如果改变n的值,refN是否会发生改变呢?
#include <iostream>
int main(int argc, char* argv[])
{
int n = 5;
int& refN = n;
refN = 6;
n = 5;
return 0;
}
运行结果:可以看到n和refN的值都变为5

4. 引用的本质及使用
引用本质上可以理解为变量的别名如果需要在函数中改变外部的内容,而又不想使用指针,可以使用引用来实现
4.1 引用使用方法1
具体代码如下:
#include <iostream>
void fooRef(int& n)
{
n = 6;
}
int main(int argc, char* argv[])
{
int n = 5;
int& refN = n;
fooRef(refN);
return 0;
}
运行结果:起到了和指针同样的效果

你想改变谁,就把谁的引用传过去,改变引用的值本质上就是对谁的改变。
4.2 引用使用方法2
上面还有一种简单的写法:将n按照引用的方式传递进函数,更改变量值
#include <iostream>
void fooRef(int& n)
{
n = 6;
}
int main(int argc, char* argv[])
{
int n = 5;
int& refN = n;
fooRef(n);
return 0;
}
运行的结果与上一致:

5. 学习视频地址:C++57个入门知识点_06_ 什么是引用
本文介绍了C++中的引用概念,作为变量的别名,它避免了指针可能导致的问题。引用用于在函数中安全地改变外部内容,无需检查地址。通过引用,可以实现与指针类似的功能,但更简洁且安全。文中展示了引用的定义与使用方法,并通过示例代码解释了引用如何工作。
226

被折叠的 条评论
为什么被折叠?



