1.2.3 将运算符重载为友元和成员函数

2013-10-07 00:17:37 · 作者: · 浏览: 67

1.2.3  将运算符重载为友元和成员函数

示例1.5中,定义了一个全局的重载“+”运算符的函数,用来操作CAdd类,但这种函数不能访问类的私有成员。由于重载运算符针对类对象进行操作,所以通常将运算符重载函数定义为某类的友元函数,或定义为类的成员函数。例如示例1.6。

示例清单1.6

#include "stdio.h"
class CAdd
{
public:
CAdd()
{ m_Operand=0; }
 CAdd(int value)
{
m_Operand=value;
}
//重载为成员函数
CAdd operator +(CAdd b)

//this为第一个默认参数
CAdd sum;
sum.m_Operand=this->m_Operand+b.m_Operand;
return sum;
}
operator int ()
{
return m_Operand;
}
//重载为友元函数,可访问私有成员
CAdd friend operator +(CAdd  a,int b)
{
a.m_Operand+=b;
return a;
}
private:
int m_Operand;
};
int main(int argc, char* argv[])
{
CAdd a(5),b,c(1);
b=a+8;   //调用友元函数
printf("sum is %d\n",(int)b);
b=a+c;   //调用成员函数
printf("sum is %d\n",(int)b);

return 0;
}
程序输出结果:
sum is 13
sum is 6

示例1.6中分别将“+”运算符重载为成员函数和友元函数,二者参数类型不同。由于类的非静态成员函数都有一个默认参数this,所以将运算符重载为非静态成员函数时,总是少声明一个参数。由于this是指针类型,所以如果将CAdd重载“+”运算符的成员函数改写为:
CAdd operator +(CAdd b)

//this为第一个默认参数
m_Operand+=b.m_Operand;
return  *this;
}
那么,主函数
int main(int argc, char* argv[])
{
CAdd a(5),b,c(1);
b=a+1;  //调用友元函数
printf("sum is %d\n",(int)b);
printf("operator a is %d\n",(int)a);
b=a+c;  //调用成员函数
printf("sum is %d\n",(int)b);
printf("operator a is %d\n",(int)a);
return 0;
}

的输出结果:

 sum is 6
operator a is 5
sum is 6
operator a is 6
因为在调用重载“+”运算符的成员函数时,对象a的成员m_Operand被改变了;而重载“+”运算符的全局函数虽然也改变了第一个实参,但由于此参数是对象a的一个备份,最终没能改变对象a的值。
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节