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

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. 6-7 adaboost分类器1

    如何利用特征来区分目标,进行阈值判决.adaboost分类器它的优点在于前一个基本分类器分出的样本,在下一个分类器中会得到加强.加强后全体的样本那么再次进行整个训练.加强后的全体样本再次被用来训练下一 ...

  2. centos查看CPU的数量

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  3. E20180412-hm

    overflow  vt. 溢出,淹没; 挤满,充满; 洋溢; 资源过剩;   n. 泛滥,溢出物; 溢流管; 充溢,过多; 超出额;   vi. 泛滥,溢出; 充溢;

  4. E20180327-hm

    renew vt. 补充; 重新开始; 使更新; 使恢复; vi. 重申,重复强调; 重新开始; renewal  n. 重建,重生; 更新,革新; 重申; 合同的续订;

  5. J20170403-gg

    うっすら 微微的,薄薄的 グラデーション 渐变 ぼかし(暈し) 晕色 由浓到淡渐变上色的东西 シャドウ 影子,阴影 ドメイン 域名  サブドメイン 子域名

  6. CSU_1216【异或最大值】

    转自:http://blog.csdn.net/fuyukai/article/details/50366133 题目简述: 经典题目,求一个数组中两个数异或运算的最大值.题目极其简单,但是要求的复杂 ...

  7. MySQL `explicit_defaults_for_timestamp` 与 TIMESTAMP

    考察下面的 SQL 脚本: CREATE TABLE test1( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, data VARCHAR(20), ts1 ...

  8. springcloud(一) 服务拆分

    一般我们的项目如果需要从单应用服务升级到微服务,必须要将原来的服务做拆分,我这边的拆分也是基于将之前spb-demo的springboot单应用做拆分,拆分出三个应用,spb-brian-query- ...

  9. 跟我一起玩Win32开发(13):握手对话框

    一提到对话框,相信对它熟悉的人不在少数,更不用说码农们了,你可能会问,对话框和窗口有什么区别吗?本质上是没有区别的,对话框也是一种窗口(前面也说过,控件也可视为子窗口). 最简单的对话框要数Messa ...

  10. Educational Codeforces Round 19 A

    Description Given a positive integer n, find k integers (not necessary distinct) such that all these ...