C++中的引用

  引用是变量的别名,它跟它所绑定的变量是没有区别的,对它的操作就等价于对它绑定的变量的操作:
#include <iostream>
using std::cout;
int main(int argc, char *argv[])
{
int a = 1, &r = a;
cout << "the address of a is " << &a << endl;
cout << "the address of r is " << &r << endl;
return 0;
}
结果是:
the address of a is 0x22ff8c
the address of r is 0x22ff8c
使用a的值与r的值当然是一样的。而通过这段代码我们还可以看出,使用a的地址与r的地址,结果也是一样的。

但是,r也是一个符号,它本身有地址吗?这个例子可以说明这个问题:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a = 1, &r = a, b = 2;
cout << "the address of a is " << &a << endl;
cout << "the address of b is " << &b << endl;
return 0;
}
结果是:
the address of a is 0x22ff8c
the address of b is 0x22ff84
熟悉activity record的人就会看出来,a和b似乎相距太大,而且距离差刚好是一个字。没错,这个r就放在这里。

那么r这个地址里面放的到底是什么呢?我们再来看:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a = 1, &r = a, b = 2;
cout << "the address of a is " << &a << endl;
cout << "the content in the gap is " << *(int *)((char *)&a - 4) << endl;
return 0;
}
这一次,结果是:
the address of a is 0x22ff8c
the content in the gap is 2293644
乍一看还觉得没什么,然而仔细一点就会发现,这个2293644的16进制表示就是0x22ff8c。这下明白了吧?所谓的引用,其实就是一个特殊的变 量,这个变量的内容是绑定在这个引用上面的对象的地址指针,而使用这个变量时,系统就会自动根据这个指针去找到它绑定的变量,然后再对变量进行操作。所以 本质上说,引用其实还是指针,只不过这个指针是不能修改的,任何对它的操作都会发生在这个指针所指向的地方,而不是在这个指针身上。所以说,C++中规定 一旦定义了引用,就必须把它跟一个变量绑定起来,并且不能修改这个绑定,就是因为这个。


那么,既然我们知道了引用的本质,那么我们可以用“不正当”的手段修改引用的绑定吗?回答是肯定的:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a = 1, &r = a, b = 2;
cout << "r is " << r << endl;
*(&a - 1) -= 8;
cout << "r is " << r << endl;
return 0;
}
结果是:
r is 1
r is 2
正常情况下不能改变的绑定,就这样被“诡异”地改过来了。

另外,关于引用其他的用法,基本上和变量一样。它同样可以使用extern来只声明不定义,等等。最后看一下这个例子:
file1.cpp:
int a = 100;
int &r = a;

file2.cpp:
#include <iostream>
using namespace std;
extern int r;
extern int a;
int main(int argc, char *argv[])
{
cout << r << endl;
cout << (int)&a << endl;
return 0;
}
这个结果很有意思。在file1.cpp中定义的引用,在file2.cpp中声明时却“错误”地声明为了普通变量。编译器不对此报错,但是在使用的时候,我们却可以看到,在file2.cpp中,这个引用就是它绑定的变量的地址了。原因就不再多说了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值