非成员友元函数、成员友元函数和友元类

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++友元函数和运算符重载的更多相关文章

  1. go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型

    从 Go 1.0.3 版本开始,不再使用 8g,8l 之类的指令进行程序的构建,取而代之的是统一的 go build 和 go install 等命令,而这些指令会自动调用相关的编译器或链接器. 如果 ...

  2. 编写可维护的JavaScript—语句和表达式&变量、函数和运算符

    语句和表达式 所有的块语句都应当使用花括号.包括: if for while do…while… try…catch…finally //不好的写法 if (condition) doSomethin ...

  3. js函数和运算符

    函数是由事件驱动或者它被调用时执行可重复使用的代码块. <script> function myFunction(){ Alert(“hello World!”): } </scri ...

  4. ↗☻【编写可维护的JavaScript #BOOK#】第4章 变量、函数和运算符

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  5. MySQL基础篇(3)常用函数和运算符

    一.字符串函数(索引位置都从1开始) CONCAT(S1,S2,...Sn): 连接S1,S2,...Sn为一个字符串,任何字符串与NULL进行连接的结果都是NULL INSERT(str,x,y,i ...

  6. 函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)

    // 友元函数和运算符重载的碰撞.cpp : 定义控制台应用程序的入口点. // #include <iostream> using namespace std; template < ...

  7. C++运算符重载(友元函数方式)

    我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函 ...

  8. 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)

    demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...

  9. Dart函数、类和运算符-处理信息

    编程语言虽然千差万别,但归根结底,它们的设计思想无非就是回答两个问题: 1.如何表示信息: 2.如何处理信息: 函数 函数是一段用来独立地完成某个功能的代码.函数是对象类型,它的类型叫做Functio ...

随机推荐

  1. Struts2中的FilterDispatcher和StrutsPrepareAndExecuteFilter的区别

    1.转自:https://blog.csdn.net/zwx521515/article/details/79300453 在Struts2开发中,很多人问到,声明过滤器的时候,为什么有的时候用&qu ...

  2. hibernate -- 分页模糊查询中setParameter 和setParameterList

    在分页模糊查询中碰到setParameter 和setParameterList这两个方法 setParameter 以前就只会用setParameter(int arg,String str),我用 ...

  3. 分区时"磁盘上没有足够的空间完成此操作"的解决方法

    在新的预装windows 7的品牌机上,工作人员一般将磁盘分为C.D两个分区.但往往造成C盘有很大一部分的空间没办法分出来,而分出来的部分空间又不能和后面的磁盘合并,甚至出现无法新建简单卷的操作,即点 ...

  4. opencord视频截图

    参考:https://www.youtube.com/watch?v=Teu9jK6GF6s

  5. 开源一个基于dotnet standard的轻量级的ORM框架-Light.Data

    还在dotnet framework 2.0的时代,当时还没有EF,而NHibernate之类的又太复杂,并且自己也有一些特殊需求,如查询结果直接入表.水平分表和新增数据默认值等,就试着折腾个轻量点O ...

  6. 洛谷 - P2280 - 激光炸弹

    https://www.luogu.org/problemnew/show/P2280 二维前缀和差分的模板题.注意学习二维前缀和的求法,不用又down又right的. #include<bit ...

  7. (构造)51NOD 1080 两个数的平方和

    给出一个整数N,将N表示为2个整数i与j的平方之和(i <= j),如果有多种表示,按照i的递增序输出. 例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2(注:3^ ...

  8. SQL Server 查询入门

    普通查询跟带条件的查询 声明:这里我将用通俗易懂的语言去教大家如何理解 SQL Server里的代码. 实例: 1.查询学生表中所有的信息 select * from Student 下面是我的理解 ...

  9. JAVA实训总结:继承-——子类创建对象原理

    继承关键字:extends Java只允许单继承存在 不可以被继承的东西: 1.private成员 体现了java的封装特点,外部类只允许set()get()方法调用,若无set()方法,则类创建的对 ...

  10. 一类 O(1) 算法的总结

    这里要注意一下, 一部分 O(1) 算法是需要 \(O(n)\) 或者 \(O(\sqrt n)\) 预处理的... 1. O(1) 求 1~n 的异或和: inline int calc(R int ...