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 ...
随机推荐
- Entity Framework 实体间的外键关系
EF 默认是开户级联删除的,这此规则将会删除非空外键和多对多的关系,如果 在数据库上下文中的实体模型类 存在着 级联引用和多重删除路径,那么EF就抛出 级联引用和多重删除路径的异常. Introduc ...
- thinkpad开机引导方式变成PCI LAN选项解决
问题:开机的引导方式变成[PCI LAN],并且前面有一个小箭头,无法正常启动加载.在BIOS中重置调整启动顺序也无法解决.无法进入U盘启动盘 1.首先开机按F12进入BIOS,选择 APP Menu ...
- 从ao神处偷取的头文件
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long lo ...
- python 可迭代对象与迭代器之间的转换
列表: >>> l = [1, 2, 3, 4] >>> l_iter = iter(l) >>> l_iter <list_iterato ...
- 黑客攻防技术宝典web实战篇:利用信息泄露习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 当探查 SQL 注入漏洞时,如果请求以下 URL:https://wahh-app.com ...
- stylus基础教程,stylus实例教程,stylus语法总结
stylus特点富于表现力.具有健壮性.功能丰富.动态编码不需要写CSS的冒号.分号.大括号和LESS.SASS功能类似,会这些的入手很快stylus特点安装使用stylus语法(一)选择器(二)变量 ...
- string类常用方法3
- CentOS6.5下安装Redis2.8.6和phpredis2.2.4扩展
一.版本说明 CentOS版本 [plain]view plaincopyprint? [root@localhost ~]# uname Linux [root@localhost ~]# unam ...
- Git之远程项目克隆到本地配置
远程代码克隆到本地工作区,需要进行简单的配置,用于识别身份 1.git config --global user.name [设置用户名,你的github用户名] 2.git config -- ...
- CF967D Resource Distribution
思路: 在一堆服务器中,资源最少的那一个是“瓶颈”,由此想到贪心思路. 首先对所有服务器按照资源数量c排序,再从头到尾扫描.对每个位置,根据x1和x2计算出两段连续的服务器集合分别分配给A任务和B任务 ...