引用是个别名。
1、引用是否占用空间
引用是否占用空间,此处是指广义上的占用内存空间,即为该对象新开辟一块内存。这个需要分不同的情况。
首先看一下常引用(const 引用)。
这里关于常引用在c++ primer中有如下描述:
1、const引用是指向const的引用。
2、非const引用只能绑定到与该引用同类型的对象;const引用则可以绑定到不同但是相关的类型的对象或绑定到右值。
重点看第二条的第二句话。
看如下例子:
int a = 10; const int &b = 42; const int & c = r+10;
以上都是合法的代码。
根据c++primer上面对不同类型情况下的解释就会更加的清楚:
double a = 3.14; const int & b = a;
上述代码等同于:
double a = 3.14; int tmp = a; const int &b = tmp;
通过打印变量的地址也可以看出不同来。
int a = 10; int &b = a; printf("&a = %p &b = %p\n",&a,&b); double c = 3.14; int &d = c; printf("&c = %p &d = %p\n",&c,&d);
由此可以看出,当常引用不同类型的对象时,会分配空间,但是由于是const,该空间也只能读取。
从狭义上看引用本身是否占用内存,先看一下《c++语言程序设计》(清华出版241页)中的一段话:
“本书引入引用概念时,曾将引用介绍为其他变量的别名。但是对于一个确定的引用来说,他可能在不同的时候表示不同变量的引用的别名,因此一定要在内存中为引用本身分配空间,来标识其所引用的变量。在程序运行时,变量只能依靠地址来区别,因此,只有通过存储被引用变量的地址,在运行时才能准确的定位被引用的变量。引用本身所占用的内存空间中,存储的就是被引用变量的地址,这和指针变量所存储的内容具有相同的性质。
......
引用本身(而非被引用对象)的地址是不可以获得的,引用一旦定义后,对他的全部行为,全是针对被引用对象的,而引用本身所占用的空间则被完全隐藏起来了。”
由此可以看出一些端倪来。
个人理解:引用是一个逻辑概念,有些东西和具体实现有关。