C++基础·笔记——引用的总结
~QQ:3020889729
~小蔡
引用的理解(C++)
引用的定义
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的含义
①引用就是一个指针常量——所谓指针常量就是,指针指向一个确定的地址,且该地址确定不变。
②既然只是确定地址不变,那么地址上的内容就是可以修改/设置的。
③引用作用的一个目标——该目标可以是对象或者说变量,但是不能是数组,因为数组不单一。
(ps:对数组操作,就直接使用指针就好。多级指针会在另外一篇博客上有说。)
引用的使用(C++)
ps:使用引用时,必须初始化,并且初始化确定后,不可以再更改。
对变量进行引用操作
关于必须初始化/不能进行第二次引用修改的说明(代码)
①必须初始化:
(代码如下)
#include "iostream"
using namespace std;
int main()
{
int a=5;
int &b;//未进行引用初始化——报错点
cout << a << endl;
cout << b << endl;
return 0;
}
结果显示:(报错)
编译提示:出现未初始化的错误。
②只能进行一次引用
(代码如下)
#include "iostream"
using namespace std;
int main()
{
int a=5;
int c=6;
int &b=a;//进行第一次引用初始化
&b=c;//再次进行引用,尝试更换引用对象
cout << a << endl;
cout << b << endl;
cout << c << endl;
return 0;
}
结果显示:(报错)
编译提示:出现左值不应该被赋值(再次引用新目标)的错误。
一、实参与实参的引用操作:
该类的引用操作就是,将一个变量的地址复制给另一个变量,两个变量都可以操控同一个地址。
(代码如下)
//实参与实参的引用操作——Text1
#include "iostream"
using namespace std;
int main()
{
int a=5;
cout << "First time cout~" << endl;
cout << "a = " << a << endl;
//还未被b引用之前,打印一次a的值,查看当前地址上的内容
cout << endl;
cout << endl;//空2行,方便查看
int &b = a;//用b引用a(a被b引用)——注意,b引用a后,不可以再引用其它的目标(变量)
b = 8;//修改b的值
cout << "Second time cout~" << endl;
cout << "a = " << a << endl;
//a被b引用后,再打印值,看前后的区别
cout << "b = " << b << endl;
return 0;
}
结果展示:(可以看出a被引用后,b修改值,a也跟着修改了)
二、实参与形参的引用操作:
形参变量使用引用,可以实现对实参的修改——同地址传递可以修改实参值一样。
(ps:当然你也可以在引用前添加const,保证引用后,函数操作中该引用的内容不发生改变。)
(代码如下)
#include "iostream"
using namespace std;
//通过设置形参为引用类型的变量
//可以实现对实参的修改功能
void be_used_points(int &a,int &b);
int main()
{
int a=5;
int c=7;//进行第一次引用初始化
cout << "First time cout~" << endl;
cout << "a = " << a << endl;
cout << "c = " << c << endl;
//还未传入函数前的值
cout << endl;
cout << endl;//空2行,方便查看
be_used_points(a,c);
cout << "Second time cout~" << endl;
cout << "a = " << a << endl;
//传入函数出来后,再打印值,看前后的区别
cout << "c = " << c << endl;
return 0;
}
void be_used_points(int &a,int &b)
{
a*=a;//改变传入参数的值
b*=b;
}
结果显示:
结果显示可以印证引用的实质——对一个目标地址的拷贝。
在函数参数为引用类型时,传入目标后,形参拷贝一份地址,进而对该地址的内容进行修改。
(再提一下,引用相当于一个指针常量,地址锁定)
返回值为引用类型的操作
返回值为引用类型——就相当于普通的返回值类型的函数返回值。
(int num()的返回值,和int &num()返回值相同)
(代码如下)
#include "iostream"
using namespace std;
//返回值为普通的int类型
int be_used_point_return_1();
//返回值为int的引用类型
int& be_used_point_return_2();
int main()
{
int c;
//int d;
int b=be_used_point_return_1();//b=5——值返回为普通类型时返回的是一个值
c=be_used_point_return_2();//c=5——值返回为引用类型时返回的也是一个值
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
int be_used_point_return_1()
{
int b=5;
return b;//返回该变量——返回值类型为整型引用
}
int& be_used_point_return_2()
{
int a=5;
int &b=a;
return b;//返回该变量——返回值类型为整型引用
}
结果显示:
说明一下,普通返回值和引用返回值,返回的用处的差别之一:
虽然两种返回的都是值,但是不能将返回值为普通类型的赋给引用类型(会报错),而引用类型却是可以把返回值赋给普通类型的。
返回值为引用类型的理解
引用——都说了是指针常量的一个应用。既然如此,返回值中的引用返回值特定的值就是该地址上的,但是呢,既是返回值,又同时拷贝了对应的地址——虽然它主要是赋值操作,但是呢,它也将引用它的变量的地址改变了。
①就拿返回值为引用类型来说,假设返回引用类型的是a,然后可以进行这样的操作:
int &b=be_used_point_return();
这样操作后,b首先获得了一个值,同时函数关闭,函数里定义的那个局部参数被释放,但是地址却也拷贝给了b,此时b上又得到一个值,也就相当于该地址上的数据未被释放——此时b就保持得到的返回值。
②而返回值未普通类型的,它就仅仅是返回该类型的值,地址为传递(拷贝)。
总结
引用,在C++中的引用既简单又易于书写,可以在一些地方替代指针,而使得代码更简洁,更健壮易读。
来源:CSDN
作者:笔岸柳影
链接:https://blog.csdn.net/weixin_44604887/article/details/104109554