C++友元函数和运算符重载
非成员友元函数、成员友元函数和友元类
1、友元的作用:
(1)友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行了数据共享的机制;
2、友元的优点和缺点
优点:提高程序的运行效率;
缺点:破坏了类的封装性和数据隐藏性,导致程序的可维护性变差;
3、特点:
(1)友元函数是可以直接访问类的私有成员的非成员函数;
(2)友元函数是定义在类外的普通函数,它不属于任何类;
(3) 一个函数可以是多个类的友元函数;
4、使用场景
(1)运算符重载的某些情况会使用友元;
(2) 两个类要共享数据的时候;
// OperatorOverload.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
using namespace std;
class Time
{
private:
int hours;
int minutes;
public:
Time(); //默认构造函数
Time(int h, int m); //重载构造函数
void addHr(int h);
void AddMin(int m);
void reset(int h = , int m = );
//重载运算符(二元)(1)至少有一个数据对象是自定义数据类型;(2)左边必须为自定义的数据类型
Time operator+(const Time &t) const; //+运算符重载,Time T1, T2; T1 + T2会编译为 T1.operator+(T2);
Time operator-(const Time &t) const; //-运算符重载, Time T1, T2; T1 - T2会编译为T
Time operator*(double n) const;
friend Time operator*(double m, const Time &t); //友元函数(类的非成员函数)
friend ostream & operator<<(ostream &os, const Time &t);
}; Time::Time()
{
hours = minutes = ;
}
Time::Time(int h, int m)
{
hours = h;
minutes = m;
} void Time::AddMin(int m)
{
minutes += m;
hours += minutes / ;
minutes %= ;
}
void Time::addHr(int h)
{
hours += h;
} void Time::reset(int h, int m)
{
hours = h;
minutes = m;
} /*重载运算符+
1、也可以使用如下友元函数原型:friend Time Time::operator+(const Time &t1, cosnt Time &t2);
2、Time t1,t2;
(1)运算符重载左侧的操作数为调用对象
(2)两个Time对象相加:t1 + t2,转换为下面两个的任意一个(两者只能选择其中一个):
(3)t1.operator+(t2); //member function
(4)operator+(t1,t2); //nomember function
*/
Time Time::operator+(const Time &t) const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes/;
sum.minutes %= ;
return sum;
} Time Time::operator-(const Time &t) const
{
Time diff;
int tot1, tot2;
tot1 = t.minutes + * t.hours;
tot2 = minutes + * hours;
diff.minutes = (tot2 - tot1) % ;
diff.hours = (tot2 - tot1) / ;
return diff;
} Time Time::operator*(double mult) const
{
Time result;
long totalMinutes = (minutes + * hours) * mult;
result.hours = totalMinutes / ;
result.minutes = totalMinutes % ;
return result;
} ostream & operator<< (ostream & os, const Time &t)
{
os << t.hours << "hours" << t.minutes << "minutes";
return os;
}
Time operator*(double m, const Time &t)
{
return t * m;
}
int main()
{ }
C++友元函数和运算符重载的更多相关文章
- go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型
从 Go 1.0.3 版本开始,不再使用 8g,8l 之类的指令进行程序的构建,取而代之的是统一的 go build 和 go install 等命令,而这些指令会自动调用相关的编译器或链接器. 如果 ...
- 编写可维护的JavaScript—语句和表达式&变量、函数和运算符
语句和表达式 所有的块语句都应当使用花括号.包括: if for while do…while… try…catch…finally //不好的写法 if (condition) doSomethin ...
- js函数和运算符
函数是由事件驱动或者它被调用时执行可重复使用的代码块. <script> function myFunction(){ Alert(“hello World!”): } </scri ...
- ↗☻【编写可维护的JavaScript #BOOK#】第4章 变量、函数和运算符
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- MySQL基础篇(3)常用函数和运算符
一.字符串函数(索引位置都从1开始) CONCAT(S1,S2,...Sn): 连接S1,S2,...Sn为一个字符串,任何字符串与NULL进行连接的结果都是NULL INSERT(str,x,y,i ...
- 函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)
// 友元函数和运算符重载的碰撞.cpp : 定义控制台应用程序的入口点. // #include <iostream> using namespace std; template < ...
- C++运算符重载(友元函数方式)
我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函 ...
- 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...
- Dart函数、类和运算符-处理信息
编程语言虽然千差万别,但归根结底,它们的设计思想无非就是回答两个问题: 1.如何表示信息: 2.如何处理信息: 函数 函数是一段用来独立地完成某个功能的代码.函数是对象类型,它的类型叫做Functio ...
随机推荐
- (bmp格式)用CDialog的OnCtlColor()消息响应处理背景画刷。
(bmp格式)用CDialog的OnCtlColor()消息响应处理背景画刷. 加载位图资源IDB_BITMAP1,在Dlg类头文件中加入: CBrush m_brush; 在OnInitDialog ...
- windows server安装zabbix-agent
1.准备安装包: 下载链接:https://www.zabbix.com/downloads/3.4.0/zabbix_agents_3.4.0.win.zip 2.在C盘下创建一个zabbix目录, ...
- IBATIS sql 小于(<) 写法 特殊符号写法
SELECT * FROM XXX where column1 <![CDATA [ < 100 ]]> ************************************ ...
- (水题)洛谷 - P1996 - 约瑟夫问题 - 链表
https://www.luogu.org/problemnew/show/P1996 试了一下数组实现的双向链表,是挺难用的,估计是应该写个get_next()函数比直接用next数组好. #inc ...
- hdoj1789【贪心】
题意: 已知有n个作业,每个作业呢,都是一天可以做完,每个作业都有一个截止日期,每个作业如果超过他的截止日期会扣分,最后让你求一个怎么安排求得一个最小扣的分数. 比如现在有3个作业 截止日期:3 3 ...
- Spring AOP SpringBoot集成
上一篇文章<Spring AOP 面向切面编程入门>对AOP作了简要的介绍,包含一些专业术语的解释. 本文基于SpringBoot编写了一个简单的Spring AOPDemo. maven ...
- PJzhang:漏洞渗透测试框架“天使之剑(AngelSword)”
猫宁!!! 参考链接: www.phpinfo.cc/?post=42 https://www.freebuf.com/sectool/149883.html 同事介绍了一款渗透测试框架AngelSw ...
- Beta版本冲刺第一天!
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...
- POJ 2104 K-th Number && 洛谷 P3834 【模板】可持久化线段树 1(主席树)
我惊奇的发现这两道题一模一样 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询 ...
- iOS MD5 (Swift3)
import Foundation extension Int { func hexedString() -> String { return NSString(format:"%02 ...