这是我参与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被释放,则不能指针与引用。
本文结束啦,相信大家收获满满!