运算符重载为类的友元函数

友元函数通过类的对象可以访问类的公有、保护和私有成员,也就是类的所有成员友元函数都能访问到。所以运算符重载为类的友元函数以后也可以访问类的所有成员。

与运算符重载为成员函数时不同的是,重载的友元函数不属于任何类,运算符的操作数都需要通过函数的形参表传递。操作数在形参表中从左到右出现的顺序就是用运算符写表达式时操作数的顺序。

这里也分双目运算符和单目运算符两种情况讨论运算符重载为友元函数的具体方式。

双目运算符

如果有双目运算符U,它的其中一个操作数是类A的对象a,那么运算符U就可以重载为类A的友元函数,此友元函数的两个参数中,一个是类A的对象,另一个是其他对象,也可以是类A的对象。这样双目运算符重载为类的友元函数后,假设运算符的两一个操作数是对象b,则表达式a U b就相当于调用函数operator U(a, b)

单目运算符

单目运算符的重载。如果有前置单目运算符U,比如前置“–”,a为类A的对象,我们想实现U a这样的运算,就可以把U重载为类A的友元函数,此友元函数只有一个形参,为类A的对象,重载后表达式U a相当于调用函数operator U(a)

如果是后置单目运算符U,如后置“++”,a还是类A的对象,那么要实现a U这样的运算,也可以把U重载为类A的友元函数,此时友元函数就需要有两个形参,一个是类A的对象,另一个是整型形参,此整型形参没有实际意义,与上一节后置单目运算符重载为成员函数时的整型形参一样,只是为了区分前置运算符和后置运算符的重载。重载后表达式a U就相当于调用函数operator U(a, 0)

例子

将上一节中第一个例子中的运算符重载改为友元函数,再简单介绍下要实现的功能:时间值的加法,比如2个小时20分钟加3个小时30分钟,应该是5个小时50分钟,运算规则就是小时数相加,分钟数相加,如果分钟数的和超过60分钟则小时数再加1,分钟数减60。

双目运算符“+”需要重载为时间值类的友元函数,此函数有两个形参,类型都是时间值类的对象。

#include <iostream>
using namespace std;
class CTimeSpan
{public:CTimeSpan(int nHours=0, int nMins=0);      // 构造函数friend CTimeSpan operator +(CTimeSpan ts1, CTimeSpan ts2); // 运算符“+”重载为成员函数int GetHours()      { return m_nHours; }   // 获取小时数int GetMins()       { return m_nMins; }    // 获取分钟数void Show();                               // 显示时间值
private:int m_nHours;       // 小时数int m_nMins;        // 分钟数
};
CTimeSpan::CTimeSpan(int nHours, int nMins)          // 构造函数的实现
{nHours += nMins/60;nMins %= 60;m_nHours = nHours;m_nMins = nMins;
}
void CTimeSpan::Show()
{cout << m_nHours << "小时" << m_nMins << "分钟" << endl;
}
CTimeSpan operator +(CTimeSpan ts1, CTimeSpan ts2)  // 重载运算符函数实现
{int nNewHours;int nNewMins;nNewHours = ts1.m_nHours + ts2.m_nHours;nNewMins = ts1.m_nMins + ts2.m_nMins;nNewHours += nNewMins/60;nNewMins %= 60;return CTimeSpan(nNewHours, nNewMins);
}
int main()
{CTimeSpan timeSpan1(2, 50);CTimeSpan timeSpan2(3, 30);CTimeSpan timeSum;timeSum = timeSpan1 + timeSpan2;cout << "timeSpan1: ";timeSpan1.Show();cout << "timeSpan2: ";timeSpan2.Show();timeSum = timeSpan1 + timeSpan2;cout << "timeSum=timeSpan1+timeSpan2: ";timeSum.Show();return 0;
}


这个程序的主函数main与上一节例子的main函数完全相同,程序运行结果也一样。

区别就是加法运算符重载为CTimeSpan类的友元函数而不是成员函数,我们看到运算符重载函数有两个形参ts1和ts2,通过这两个参数将需要进行运算的操作数传递进去,而在此函数中也能够访问类CTimeSpan的私有成员m_nHours和m_nMins。

运算符重载为类的友元函数相关推荐

  1. 运算符重载为类的成员函数

    运算符重载 运算符重载为类的成员函数后就可以像其他成员函数一样访问本类的数据成员了. 在类的外部通过类的对象,可以像原运算符的使用方式那样使用重载的运算符,比如,"+"运算符被重载 ...

  2. 【C++】Complex复数类运算符重载(类的成员函数实现)

    一.复数类运算符重载 <1>分类: 在c++中,有些运算符可以重载,有些不可以重载,详情见下图: 那么,一般用的比较多的有**+.-.*./.=.前置++,- -.后置++,- -.< ...

  3. C++:运算符重载与类的赋值运算符重载函数

    目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:=重载函数(赋值运算符重载) 1.自定义= ...

  4. C++运算符重载(类内、外重载)

    1.概念   运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数).   用函数的 ...

  5. C# 类型运算符重载在类继承中的调用测试

    C# 类型运算符重载在类继承中的调用测试 这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA {}class CB : CA{}class CC : CB{}}void Test(CA ...

  6. 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  7. 【C++】模板类的友元函数

    模板类友元函数 模板类的友元函数 参考:https://blog.csdn.net/dreamer_lhs/article/details/53580088 区分:友元是否为函数模板 非模板友元 约束 ...

  8. C++总结 友元类和友元函数

    在网上看到的文章, 写的挺全的,  具有总结性质. 于是转过来了.. 源地址(呵呵, 他也是转的)http://www.cnblogs.com/skyczw/archive/2008/05/27/12 ...

  9. 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案

    今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题. 大致代码如下 <pre name="code" class="cpp&q ...

最新文章

  1. 服务器技术综述(三)
  2. 长治学院计算机在哪个校区,长治学院有几个校区及校区地址
  3. 我们总结了每个技术团队都会遇到的 4 个难题
  4. 【Linux】—— /usr/bin/perl 被 MySQL-community-server-8.0.26-1.el7.x86_64 需要,解决方法
  5. 「实用」微信扫码 - 关注公众号后网站自动登录
  6. Java之【线程通信】--标志位练习
  7. Android Framework------之Keyguard 简单分析
  8. python爬虫更改ip_Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式
  9. 计算机表格中如何计算数据透视表,在数据透视表中计算值
  10. idea swagger生成接口文档_Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据...
  11. mac 解压_Mac上哪款解压工具好用啊?
  12. java菜单如何点解_解读java菜单
  13. 阿里云解决方案汇总,24种上云场景,20O+篇企业上云实践
  14. Tableau数据连接与加载(数据提取)
  15. 使用Service Worker发送Push推送
  16. Android setTheme设置透明主题无效
  17. 手机厂商“卷”到了手腕上
  18. 中国大学生计算机设计大赛英语,中国大学生计算机设计大赛2018.pdf
  19. Airbnb、小猪短租等这类短租类产品发展前景如何?
  20. 计算机和人脑在线阅读,人脑与电脑

热门文章

  1. Mybatis-SpringBoot集成/配置
  2. 4.10_composite_结构型模式:组合模式
  3. 两个文件比较 linux,linux下比较2个文件
  4. 军队计算机使用管理规定,军队通用计算机系统使用安全要求.doc
  5. mongoose的操作及其常用命令
  6. 卡尔曼滤波—建立状态空间表达式
  7. 培生同意以3亿美元出售华尔街英语
  8. oracle的数据泵导入,导出以及创建用户及删除当前连接用户
  9. Android Studio来了,它能取代Eclipse吗?
  10. Win7系统解决JAVA或者APKtool不是内部或者外部命令