文章目录
先说疑惑点:引用到底是不是变量?占不占内存空间?
根据我查到的(我信服的):
”引用“是编译器通过“常指针”的方式实现了“变量别名”这一机制;即:
(1)“引用”本质上是常指针,占内存空间;
(2)只不过编译器隐藏了实现过程(也隐藏了用*的过程,更隐藏了这个指针本身);使“引用”看起来,用起来,就像是造出了变量别名这个新机制一样;
(3)在使用时,不需要考虑怎么实现的,就按引用的特点来用就可以。
备注:可以在参考部分看大佬反汇编的分析;
下面就抛开本质上的指针而完全按引用的特点来说明使用:
1、引用是一个变量的别名,没有新变量,只是多了一个新的名字;
(1)定义一个变量,是向内存中申请一块空间,比如int a;则申请一块int类型大小的空间,这个空间有一个地址,用a这个名字去映射这个地址,使用a就能操作这个地址上的数据;
(2)定义一个引用,比如int &b = a;则引用的特性是:b是a的内存空间的新名字,一般称为:别名,既然b和a一样都是这个空间的名字,那么怎么操作b也就相当于怎么操作a;
(3)定义引用,只是产生了一个新名字,而不是定义一个新变量,不会申请内存空间;从C++程序员角度来看,sizeof(b) 等于 sizeof(a); &b 和&a取出来的地址相同;修改b,a也被同步修改;表面上看,确实是别名的效果;
(4)引用必须在定义时初始化,且初始化后不能再改去引用其他变量;既然是别名,那肯定要有第一个名字存在,所以必须在定义时指明要引用的变量;一经初始化,b的本体被隐藏,操作b也就实在操作a,也根本不存在改变引用对象这回事;
(5)举例理解:小白因为军训晒黑了,有了新绰号小黑,虽然名字不一样,但都是小白这个人,而提出新绰号小黑也不会凭空造出一个人来;我们不会先取一个绰号放着等人晒黑,也不会把一个人的绰号转给别人;
看下面的代码,先定义变量a;再定义b引用a;
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int &b = a;
cout << a << " -a- " << &a << endl;
cout << b << " -b- " << &b << endl;
b=15;
cout << a << " -a- " << &a << endl;
cout << b << " -b- " << &b << endl;
return 0;
}
结果: