reference(引用)(左值引用)你真的懂吗?

483 阅读3分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

引用分为左值引用与右值引用,本文主要谈左值引用

先谈谈引用的定义:

引用为对象起了另外一个名字,引用类型引用另外一种类型。通过&说明符写成引用类型。

定义比较晦涩难懂,我们直接通过示例了解:

int x=1024;
int &y=x;
std::cout<<y<<std::end;

示例输出就是1024;

上面示例很好理解,引用的细节还是很值得琢磨的

细节一:引用即别名

引用即别名,引用并非对象,相反的他只是为一个已经存在的对象所起的另外一个名字。

细节二:引用必须初始化

引用必须初始化,一旦绑定对象后,就无法重新绑定!!简单的说就是一夫制度或者一妻制度,但不能说成一夫一妻制,因为一个变量有可以多个引用。

示例:

int a=1;
int &b=a;//b与a绑定后,b智能只能代表a;
int a1=2;
b=a1;//b=2; a=2;
int &c=b;//b与c都代表a

b与a绑定后,b智能只能代表a,b与c都代表a。

细节三:引用与常量

变量应用不能绑定常量,但常量引用可以!!

示例:

const int &x=1234;//正确
//int &x=1234;//错误
cout<<x<<endl;

细节四:引用的假象

引用会造成大小和地址与原变量相同的假象!!

1、sizeof(a)==sizeof(b);

2、&a==&b;

这两点都是假象,假象。只是采用sizeof()与&时,编译器会返回原对象的大小与地址,因为b是a的别名,C++把b做的和a一样,这样才能叫别名。

细节五:引用的真实大小

引用的层是用指针实现的,其大小就是对应类型指针的大小!

引用类型的变量会占用内存空间,占用的内存空间的大小和指针类型的大小是相同的。

细节六:引用与函数重载

引用类型不能算作函数重载!因为它们的签名(same signature)是相同的!

示例:

void AA(int x){}
void AA(int &x){}

上示例是不会发生函数重载的!但下面的可以

void AA(int x){}
void AA(int x)const{}

上示例都是在成员函数的情况下,因为函数尾部const只能在成员函数出现;

什么时候应该用引用呢?

1、参数传递的时候

参数传递值传递vs引用传递,值传递需要开辟额外的栈内存,引用只需要开辟指针大小的栈内存即可。尽量传参传引用,引用相当于变量的另一个名,当然、值传递也有好用的地方,比如这个值变化会影响其他内容,如果不影响且不改变该变量值尽量引用,比如回溯算法里的递归,最终结果用引用,中间的一些变量用值传递

2、针对返回值为引用

函数的操作结果放在已有内存位置还是新创建内存位置。如果函数操作结果放在本函数local位置,函数结束local被释放,则不能指针与引用。

本文结束啦,相信大家收获满满!