昨天做友元函数练习的时候,发现了这个问题。之前我把他一直以为成地址(函数形参为类对象的引用),可是传个对象的地址又不对,只能穿对象。今天再看C++中const用法时又遇到了。所以索性深入理解了一下。有些地方可能比较模糊,还请大神们指教!
比较通用的说法,引用即别名。
#include <iostream>
using namespace std;
void main()
{
int j=5;
int &i=j;
cout<<i<<endl;
}
无论是输i还是 j都是同样的结果。对i的别名上j的所有操作即是对i的操作。
谭浩强的C++书是这样说的:变量名和引用名都指向同一内存单元。更深刻的理解:在函数调用中,如果形参为变量的引用名,实参为变量名,则在函数调用进行虚实结合时,并不是为形参另外开辟一个存储单位(建立实参的一个拷贝),而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量。
下面这个例子可以体会到:
第一个程序:
#include <iostream>
using namespace std;
class Time
{
public:
int hour;
int minute;
int second;
Time(int i,int j,int k)
{
hour=i;
minute=j;
second=k;
}
Time& change();
void display();
};
void show( Time &t)
{
t.hour=10;
}
Time& Time::change()
{
hour++;
minute++;
second++;
return *this;
}
void Time::display()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
void main()
{
Time t(20,30,40);
show(t);
t.display();
t=t.change();
t.display();
}
如果把
void show( Time &t)
{
t.hour=10;
}
改成
void show( Time t)
{
t.hour=10;
}
则结果会变成:
在这里可以和函数传参是单向传递的联系起来,当对象进入show函数里时,t.hour的值的确改变了,但从该函数里出来后他的值又变回和之前进入该函数时的值了。在C语言中,处理这种现象时,我们会传给一个地址,在内存上改变他的值。
从上面的例子我们可以体会到虽然形参是对象的引用,即一个别名,实参也是一个对象,但实际采用了上面所说的:在函数调用进行虚实结合时,并不是为形参另外开辟一个存储单位(建立实参的一个拷贝),而是把实参变量的地址传给形参(引用名)。
但我们应该注意,在调用函数时,不能写成:show(&t).
第二个程序:
#include <iostream>
using namespace std;
class Time
{
public:
int hour;
int minute;
int second;
Time(int i,int j,int k)
{
hour=i;
minute=j;
second=k;
}
Time* change();
void display();
};
void show( Time *t)
{
t->hour=10;
}
Time* Time::change()
{
Time *p;
hour++;
minute++;
second++;
p=this;
return p;
}
void Time::display()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
void main()
{
Time t(20,30,40),*p;
p=&t;
show(&t);
t.display();
p=p->change();
p->display();
}
采用指针实现也可以达到同样的效果: