|
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; } | 程序输出结果:
示例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】
|