博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++:成员运算符重载函数和友元运算符重载函数的比较
阅读量:5815 次
发布时间:2019-06-18

本文共 2348 字,大约阅读时间需要 7 分钟。

5.2.4 成员运算符重载函数和友元运算符重载函数的比较

(1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数;对于单目运算符而言,成员运算符重载函数参数表中没有参数,而友元运算符重载函数参数表中有一个参数。

(2)双目运算符一般可以被重载为友元运算符重载函数或成员运算符重载函数,但有一种情况必须使用友元函数。

例如,如果将一个复数与一个整数相加,可用成员运算符重载函数"+"运算符:

Complex operator+(int a)
{
     return (real+a,imag);
}
若com和com1是类Complex的对象,则以下语句是正确的;
com = com+100; //正确,运算符+的左侧是类对象
这条语句被C++编译系统解释为:
com = com.operator(100);
由于对象com是运算符"+"的左操作数,所以它可以调用"+"运算符重载函数operator+,
执行结果是对象com的数据成员real被加上一个整数100.
然而,以下语句就不能工作了:
com = 100+com; //运算符+的左侧是整数
这条语句被C++编译系统解释为:
com = 100.operator(com);
由于运算符"+"的左操作数是一个整数100,而不是该类的对象。编译时将会出错,因为整数100不能调用成员运算符重载函数。

如果定义以下的两个友元运算符重载函数
friend Complex operator+(Complex com,int x) //运算符+的左侧是类的对象,右侧是整数
{
      return Complex(com.real+x,com.imag);
}
friend Complex operator+(int a,Complex com) //运算符+的左侧是整数,右侧是类的对象
{
      return Complex(a+com.real,com.imag);
}
当一个复数与一个整数相加时,无论整数出现在左侧还是右侧,使用友元运算符重载函数都能得到很好的解决。这就解决了使用成员运算符重载函数时,由于整数出现在运算符+的左侧而出现的错误。 

//例5.7 使用友元运算符重载函数实现一个复数与整数的相加。

#include
using namespace std;class Complex{ public: Complex(int r=0,int i=0) { real = r; imag = i; } void print(); friend Complex operator+(int a,Complex &c2); //声明友元运算符重载函数,+的左侧是整数,右侧是类的对象 friend Complex operator+(Complex c1,int a);//声明友元运算符重载函数,+的右侧是整数,左侧是类的对象 private: int real; int imag;};Complex operator+(int a,Complex &c2) //定义友元运算符重载函数,+的左侧是整数,右侧是类的对象 { Complex temp; temp.real = a+c2.real; temp.imag = c2.imag; return temp;}Complex operator+(Complex c1,int a)//定义友元运算符重载函数,+的右侧是整数,左侧是类的对象 { Complex temp; temp.real = c1.real+a; temp.imag = c1.imag; return temp;} void Complex::print(){ cout<
<<"+"<
<<'i'<

(3)成员运算符函数和友元运算符函数都可以用习惯方式调用,也可以用它们专用的方式调用。

表5.2 运算符函数调用形式
------------------------------------------------------------------------------------------
习惯调用形式 友元运算符重载函数的调用形式 成员运算符重载函数的调用形式
a+b operator+(a,b) a.operator+(b)
-a operator-(a) a.operator-()
a++ operator++(a,0) a.operator++(0)
------------------------------------------------------------------------------------------

(4)C++大部分运算符既可以说明为成员运算符重载函数,又可以说明为友元运算符重载函数。

一般而言,对于双目运算符,将它重载为友元运算符重载函数比重载为成员运算符函数便于使用。
对于单目运算符,则选择成员运算符重载函数比较好。
如果运算符所需要的操作数(尤其是第一个操作数)希望有隐式类型转换,则运算符重载必须使用
友元函数,而不能使用成员函数。
a.对于单目运算符,建议选择成员函数
b.对于运算符"=、()、[]、->"只能作为成员函数
c.对于运算符"+=、-=、/=、*=、/=、!=、~=、%=、<<=、>>=",建议重载为成员函数
d.对于其他运算符,建议重载为友元函数。

 

转载地址:http://xmmbx.baihongyu.com/

你可能感兴趣的文章
登录有关的session和cookie(后台)
查看>>
Java多线程进阶(三三)—— J.U.C之collections框架:LinkedBlockingQueue
查看>>
构建静态页面 之 [ 表单 ]
查看>>
PHP下的异步尝试一:初识生成器
查看>>
Java 设计模式之装饰者模式
查看>>
JS 时间字符串和时间戳的相互转换
查看>>
NLP的ImageNet时代已经到来
查看>>
C++下的OpenCV中Mat类型存储的图像格式
查看>>
小程序开发
查看>>
本地IDC机房数据库容灾解决方案
查看>>
最大公约数
查看>>
linux下单节点oracle数据库间ogg搭建
查看>>
Prototype1.5.1源代码解读分析-3
查看>>
dev c++ Boost库的安装
查看>>
72、STP安全配置实验之BPDU Guard
查看>>
shell之awk 记录
查看>>
Vmware Failed to login into NFC server Datastore error
查看>>
采用oracle过程发邮件
查看>>
Mysql 存储过程应用
查看>>
半同步复制简介
查看>>