本篇将会讲C++中很重要的概念-引用,引用得概念出现的是比较晚的,引用是在C语言中没有的,但是在C++,Java等都是很常见的。
那什么是引用?引用又有什么作用呢?本篇将会进行介绍。
总结:
- 引用的使用情况:当需要改变外部内容(实参,跨作用域),使用指针需要进行地址的判断(保证不为空),为了避免指针问题,使用引用;
- 引用的本质:给外部内容起了一个别名;
- 如何定义引用:引用(左值引用)的写法:
int& refN = n;
&为取地址符号; - 如何使用引用:
fool(int& n)
外部函数中:int& refN=n
fool(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_ 什么是引用