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 ...
随机推荐
- 转:深度学习与自然语言处理之五:从RNN到LSTM
原文地址:http://blog.csdn.net/malefactor/article/details/50436735/ 大纲如下: 1.RNN 2.LSTM 3.GRN 4.Attention ...
- Codechef WEASELSC
WEASELSC code 给定一个高度图 a[1..n] ,要求你减少图中一些地方的高度,使得得到的图是一个不超过 K 级的楼梯,要求楼梯的面积最大(即得到的图中所有位置的高度之和最大). 这题题面 ...
- Swift3.0 元组 (tuples)
//元组 //不需要的元素用 _ 标记 let (name,age,_) = (","男") print(name,age) //通过下标访问特定的元素 let stud ...
- Codeforces Round #324 (Div. 2)C. Marina and Vasya
A的万般无奈...后来跑了大牛的这份代码发现, 题意是求一个序列与给定的两个序列有t个不同. 只要保证...对应位置就行了.. 所以处理起来非常方便.............. 可是没有感觉是对应位置 ...
- MongoDb 查看用户名列表 , 修改用户密码
修改用户密码: db.addUser("java","java"); 查看一下所有的用户 , 查看当前Db的用户名 db.system.users.find ...
- 日志系统:一条sql更新语句是如何执行的?--Mysql45讲笔记记录 打卡day2
下面是一个表的创建语句,这个表有一个主键id和一个整型字段c: create table t(id int primary key,c int); 如果要将 id = 2 这一行的值加 1,sql语句 ...
- 1.基础数据类型的初识 字符串 bool 整型 if else elif
---恢复内容开始--- 计算器基础知识 cpu :人类的大脑 运算和处理问题 内存:临时存储数据 断点就消失了 高铁 硬盘:永久存储数据 图片 操作系统:是一个软件 控制每个硬件之间的数据交互 Py ...
- C++类的默认函数
在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++ ...
- 通过split命令分割大文件
场景 线上出了问题,我需要去查找log来定位问题,但是由于线上数据量庞大,这些log文件每过一个小时就会自动回滚一次,尽管如此,有的log文件依然达到了五六g以上的大小. 对于这种巨大的log文件,常 ...
- C/C++预处理
C/C++编译系统编译程序的过程为预处理.编译.链接.预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序.预处理器指令以#号开头标识,末尾不包含分号.预处理命令不是C/C++语言 ...