注册 登录
编程论坛 C++教室

引用&,这个符号到底代表什么?

cclearner 发布于 2007-06-30 21:48, 1076 次点击
搞不懂了,到底是代表执行什么。
#include<iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};
const int A::b=10;
A::A(int i):a(i),r(a)
{
}
void A::print()
{
cout<<a<<":"<<b<<":"<<r<<endl;
}
int main()
{
A a1(100),a2(0);
a1.print();
a2.print();
}
红色这一句,删掉&
输出的就不知道r是怎么一回事了,可是我不知道这个删掉&后的程序,怎么就不对呢?
8 回复
#2
野比2007-06-30 22:10

没有&的话, 分配给r一个具体内存空间, 因为在后面没有初始化, 所以输出不可预料
有&的话, 没有给r内存空间, 只是一个符号地址, 所以它指向它下面一个实际对象的内存空间(这里就是a)
即, 有&的话, 此时r的地址和a的地址是一样的, r就是a..
所以输出你应该看到r=a...

#3
aipb20072007-06-30 22:30
野比解释的太深了,给你解释下浅点的:
在语法上&有两种,一是取地址,一是引用。
这里是后者。
因为在类定义的时候,r先于a,所以在构造对象时,尽管是:a(i),r(a) ,但是实际上是:r(a),a(i)。
所以如果不用引用&,那么在r(a)时,a是未定义的,就出现了未定义的值,结果不对。
如果用引用&,那么根据引用的定义,const int &r = a,实际上r就是a的别名,他们是同一个对象,站用相同内存。
然后a(i),定义const a = i,这个操作同时定义了r。
如果你把类定义中r和a的顺序换下,那么有没引用都一样的结果。
比如:
#include <iostream>
using namespace std;

class A
{
public:
A(int i);
void print();

private:
const int a;
const int r;
static const int b;
};
const int A::b=10;
A::A(int i):a(i),r(a)
{
}
void A::print()
{
cout<<a<<":"<<b<<":"<<r<<endl;
}
int main()
{
A a1(100),a2(0);
a1.print();
a2.print();
}
#4
野比2007-06-30 22:33
我觉得我的解释挺形象的来着...
#5
aipb20072007-06-30 22:38
看篇幅也是我的形象啊!

哈哈~~~~~~~~
开玩笑。
#6
野比2007-06-30 23:27


简单一句, 引用就是EQU伪操作(在这里)和OFFSET伪操作(通常情况)...
等学微机原理就明白了...

#7
cclearner2007-07-01 00:16
啊,两位大虾解释得都很形象啊,我明白了,好好开心,好好激动,真是佩服得五体投地阿~~~~~~~~~

二位的加起来真是perfect阿!
微机原理?my god!
也许学不着了。。。。。。
#8
duffebear2007-07-02 13:01
好帖就要顶
#9
cclearner2007-07-02 22:07
别顶了
显得我好菜~
1