-
C++中有没有引用数组这个概念?
试分析下面这段代码会不会出现错误。
struct St
{
int& x;
int& y;
int& z;
};
int a = 1;
int main()
{
int b = 2;
int* pc = new int(3);
St st = {a, b, *pc};
int& array[] = {a, b, *pc};
delete pc;
}
结构体变量中有三个int&型成员,由于引用在定义时必须初始化,所以结构体变量就被a,b,pc分别初始化了,成为了他们的别名。所以St st = {a, b, *pc}这一句并没有错误。
打印出结构体中三个引用的地址:
&st.x :010E2000
&st.y :011EFE0C
&st.z :0175B5C
然后我们再来看看这一句:int& array[] = {a, b, *pc}。这一句表示定义一个引用数组,也分别由a、b、*pc初始化。但是编译器却报错了。原因其实是数组元素在内存中是连续的,不能将三个地址不连续的变量初始化给int&型数组。
所以得出结论:C++中没有引用数组这个概念!
-
引用占内存吗?
经过上面的问题,我们发现引用没有独立空间,和其引用实体共用同一块空间,但真的是这样吗?
把上面的代码进行修改:
struct St {
int start;
int& x;
int& y;
int& z;
int end;
};
int a = 1;
int main()
{
int b = 2;
int *pc = new int(3);
St st = { 10, a, b, *pc, 20};
cout << &st.start << endl;
cout << &st.x << endl;
cout << &st.y << endl;
cout << &st.z << endl;
cout << &st.end << endl;
delete pc;
return 0;
}
在结构体开始和结束时分别加了一个变量。
打印出start和end变量的地址:
&st.start:0093F718
&st.x :010E2000
&st.y :011EFE0C
&st.z :0175B5C
&st.end:0093F728
我们发现,x、y、z依旧是引用的实体的地址,而start和end却是连续存放的,中间相隔了12个字节(减去start的4字节)。
所以得出结论:引用在底层实现上实际是有空间的,只不过编译器不让我们直接获取到实现引用的那个指针常量。