C++ 中的引用

        昨天做友元函数练习的时候,发现了这个问题。之前我把他一直以为成地址(函数形参为类对象的引用),可是传个对象的地址又不对,只能穿对象。今天再看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();

}


采用指针实现也可以达到同样的效果:

通过这个程序的比较可以体会到形参为引用和指针的区别,引用是隐式的通过别名将地址传给形参,即采用虚实结合的方法,(别名和变量指向同一内存地址),而形参为指针时,是显示的将地址传给形参,即通过在内存上改变值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值