接上篇:C++57个入门知识点_06_ 什么是引用(需改变外部内容,用指针存在判断地址的问题、引用本质给外部内容起别名、fool(int& n) 外部函数:int& refN=n fool(refN/n)),本篇主要讲引用的使用。
总结:
-
1.引用在定义时就必须初始化,不能用常量进行赋值,需要采用变量进行赋值;int& refN = n;
对上句的理解:引用本质是变量的别名,变量是可以修改的,如果可以用常量赋值,那这个常量是不是就可以修改了? -
2.只有常量引用才可以使用常量进行初始化,如果想要对常量引用,可以使用const int& refN = 123;
-
3.引用的关系一旦建立则无法修改
-
4.引用的使用:
(1)作为函数参数void fooRef(int& n){n = 6;} 引用时fooRef(n);
(2)作为函数的返回值int& fooRtnRef() {int k = 3;return k;} int& refk = fooRtnRef(); -
5.不存在二级引用,但可以使用指针的引用来替代二级指针
-
引用既可以像指针一样使得修改立即生效(地址传递),又没有指针那么麻烦需要解引用、获取地址,使用方便。
1. 引用使用变量进行初始化
在上篇我们对引用赋值采用int& refN=n
的形式,那是否可以直接采用int& refN=8
进行赋值呢?
int main(int argc, char* argv[])
{
int& refN = 5;
return 0;
}
可以看到如下报警:非常量引用的初始值必须为左值
使用nullptr
也是同样的效果
引用在定义时就必须初始化,不能用常量进行赋值,需要采用变量进行赋值;int& refN = n;
对上句的理解:引用本质是变量的别名,变量是可以修改的,如果可以用常量赋值,作为常量的别名,那这个常量是不是就可以修改了?
2. 常量引用使用常量进行初始化
如果需要指向常量呢?可以采用如下方法:const int& refN = 5;
只有常量引用才可以使用常量进行初始化,如果想要对常量引用,可以使用const int& refN = 123;
。
3.引用的关系一旦建立(别名关系),无法修改
下面的一段代码,使用refN = m;
,m
改变的是引用关系,使refN
成为m
的别名,还是对refN
进行赋值,修改了n
的值呢?
#include <iostream>
int main(int argc, char* argv[])
{
int n = 5;
int m = 6;
int& refN = n;
refN = m;
return 0;
}
运行结果:可以看到refN和n的值都发生了改变,当refN称为n的别名,就永远不会改变
4.引用的使用:函数参数、函数返回值
(1)最常见的用法作为函数参数
函数:void fooRef(int& n){n = 6;} 引用:fooRef(n);
(2)作为函数的返回值
#include <iostream>
int& fooRtnRef()
{
int k = 3;
return k;
}
int main(int argc, char* argv[])
{
int& refK = fooRtnRef();
refK = 123;
return 0;
}
运行结果:k作为引用返回给refK ,refK = 123;实现的是改变refK 和函数中k值的作用,因此两个的值均从3变为123。
查看局部变量原内存地址内容的方法: 函数中的k作为内部值,可以使用内存进行查看,单步运行至函数体,得到k的地址,通过VS查看其地址内的值的变化
。
但是有一个安全隐患,函数外界改变函数内部局部变量值,函数一旦出了作用域,函数内部的局部变量应该清空释放,通过引用去改变的是一个已经释放控件的值,这个内存下的值可能已经分配给其他变量了,已经不属于k了,可能产生不可预料的结果
。因此在将引用作为返回值是,需要保证返回的值还在生命周期内。
5.不存在二级引用
指针存在二级指针:int* p=(&n); int** pp=&p,但不存在二级引用,但可以使用指针的引用来替代二级指针,这样就可以少写一个指针
。
以下代码利用指针的引用实现了指针交换,之前我们可能会使用二级指针实现交换,通过引用就可以实现少写一个指针的目的。
#include <iostream>
//交换两个指针
void exchange(int*& n1, int*& n2)
{
int*k = n1;
n1 = n2;
n2 = k;
return;
}
int main(int argc, char* argv[])
{
int n = 5;
int m = 6;
int* pN = &n;
int* pM = &m;
exchange(pN, pM);
return 0;
}
运行结果:指针实现了交换
6. 学习视频地址:C++57个入门知识点_07_ 引用的使用