C++中引用的一些问题

  • 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字节)。

所以得出结论:引用在底层实现上实际是有空间的,只不过编译器不让我们直接获取到实现引用的那个指针常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值