在线等待:一个关于C++中重载友元函数运算符的小问题.

来源:百度知道 编辑:UC知道 时间:2024/05/26 18:56:11
首先请看一段代码:
#include <iostream>
using namespace std;
class assign
{
public:
int a;
friend int operator*(assign var1,assign &var2);
};
int operator*(assign var1,assign &var2)
{
var2.a=var1.a*5;
var2.a=var1.a*var2.a;
return var2.a;
}
assign object_1,object_2,object_3;
void main(void)
{
object_1.a=15;
object_2.a=10;
object_3.a=object_2*object_1;
cout<<"object_1.a "<<object_1.a<<"\n";
cout<<"object_2.a "<<object_2.a<<"\n";
cout<<"object_3.a "<<object_3.a<<"\n";
}
编译之后,输出的结果为:
object_1.a 500
object_2.a 10
object_3.a 500

我的问题:1,函数定义friend int operator*(assign var1,assign &var2);中,明明是引用var2的指,为什么object_2.a的值不改变而object_1.a的值改变了?
2,为什么object_1.a的值是500?这个值是怎么算出来的?
请前辈们指点一下,感激不心,我会一

因为var2定义成了引用(注意看前面的&),函数在使用引用传递的方式的时候,实际上是把object_1的地址传给了var2(这样var2相当与object_1的别名),而var1只是在调用的时候object_2的值传给了var1,注意认真看下书上的值传递,和传址调用。在调用结束后var1的内存空间释放,也就是object_2的值不变。但因为var2是传址调用,object_1的值也就是var2的值,看下书上的指针(这种以引用作为形参与指针做形参是一样的)。
关于500怎么来的?
看重载的运算符函数
var2.a=var1.a*5; (var2.a现在相当于object_1.a,而var1.a得到的只是object_2.a的值10)
var2.a=10*5=50;
var2.a=var1.a*var2.a;
(var2.a=10*50=500;)
return var2.a;
(返回的这个var2.a值即赋给var3.a,这样var3.a=500)
这个过程中object_2.a只是把它的值传给了var1,它自己没有变。而因为object_1是引用传递,var2相当于就是object_1的别名,因为它们的地址是相同的。