设为首页 加入收藏

TOP

1.2.3 将运算符重载为友元和成员函数
2013-10-07 00:17:37 来源: 作者: 【 】 浏览:64
Tags:1.2.3 运算 重载 元和 成员 函数

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】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.1.3 重载函数使用实例 下一篇1.4 运算符重载在MFC中的应用举例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: