C++学习:类的使用--运算符重载

我们知道C++可以对函数进行重载,让同名的函数来完成相同的基本操作。其实运算符也是可以重载的,而且有的运算符已经在使用了,就像*,既可以用于地址,又可以用于乘法。

下面是一个计算时间的类

#ifndef MYTIME_H
#define MYTIME_H#include <iostream>using namespace  std;class Time
{
private:int hours;int minutes;public:Time();Time(int h, int m = 0);void AddMin(int m);void AddHr(int h);void Reset(int h = 0, int m = 0);Time Sum(const Time& t) const;void Show() const;
};#endif // MYTIME_H

 

#include "mytime.h"Time::Time()
{hours = minutes = 0;
}Time::Time(int h, int m)
{hours = h;minutes = m;
}void Time::AddMin(int m)
{minutes += m;hours += minutes/60;minutes %= 60;
}void Time::AddHr(int h)
{hours += h;
}void Time::Reset(int h, int m)
{hours = h;minutes = m;
}Time Time::Sum(const Time &t) const
{Time sum;sum.minutes = minutes + t.minutes;sum.hours = hours + t.hours + sum.minutes/60;sum.minutes %= 60;return sum;
}void Time::Show() const
{cout << hours << " hours, " << minutes << " minutes.\n";
}

 

#include <iostream>
#include "mytime.h"using namespace std;int main()
{Time planning;Time coding(2, 40);Time fixing(5, 55);Time total;cout << "planning time = ";planning.Show();cout << endl;cout << "coding time = ";coding.Show();cout << endl;cout << "fixing time = ";fixing.Show();cout << endl;total = coding.Sum(fixing);cout << "coding.Sum(fixing) = ";total.Show();cout << endl;return 0;
}

输出结果

planning time = 0 hours, 0 minutes.coding time = 2 hours, 40 minutes.fixing time = 5 hours, 55 minutes.coding.Sum(fixing) = 8 hours, 35 minutes.

添加加法运算符

将Time类转换为重载的加法运算法很容易,只要将Sum()的名称改为operator +()即可。只要把运算符+放在operator的后面

#ifndef STOCK_H
#define STOCK_H
#include <string>using namespace std;class stock
{
private:string company;long shares;double share_val;double total_val;void set_tot() {total_val = shares * share_val;}public:void buy(long num, double price);void sell(long num, double price);void update(double price);void show() const;const stock& topval(const stock& s) const;stock(const string& co, long n, double pr);stock();~stock();
};#endif // STOCK_H

#include "mytime.h"Time::Time()
{hours = minutes = 0;
}Time::Time(int h, int m)
{hours = h;minutes = m;
}void Time::AddMin(int m)
{minutes += m;hours += minutes/60;minutes %= 60;
}void Time::AddHr(int h)
{hours += h;
}void Time::Reset(int h, int m)
{hours = h;minutes = m;
}//运算符+重载
Time Time::operator+(const Time &t) const
{Time sum;sum.minutes = minutes + t.minutes;sum.hours = hours + t.hours + sum.minutes/60;sum.minutes %= 60;return sum;
}void Time::Show() const
{cout << hours << " hours, " << minutes << " minutes.\n";
}
operator+(const Time &t) const与Sum(const Time &t) const效果完全一样,可以理解operator+()就是一个函数,也可以被调用。就像下面的语句一样。
total = coding.operator+(fixing);

但是可以进一步简化

total = coding + fixing;

 这两种方法都讲使用operator+()函数,运算符左侧的coding是调用对象,右边的fixing是参数被传递的对象。

#include <iostream>
#include "mytime.h"using namespace std;int main()
{Time planning;Time coding(2, 40);Time fixing(5, 55);Time total;cout << "planning time = ";planning.Show();cout << endl;cout << "coding time = ";coding.Show();cout << endl;cout << "fixing time = ";fixing.Show();cout << endl;//total = coding.operator+(fixing);total = coding + fixing;cout << "coding.Sum(fixing) = ";total.Show();cout << endl;return 0;
}

输出结果没有变化

planning time = 0 hours, 0 minutes.coding time = 2 hours, 40 minutes.fixing time = 5 hours, 55 minutes.coding.Sum(fixing) = 8 hours, 35 minutes.

 运算符重载的限制:

1、重载后的运算符必须至少有一个操作数是用户定义的类型;

2、使用运算符使不能违反运算符原来的句法规则;

3、不能创建新的运算符;

4、有些运算符不能被重载:如sizeof, ?:, ::等

5、大多数运算符都可以通过成员或者非成员函数进行重载,但=、()、[]、->只能通过成员函数进行重载。

+ 、-、 *重载的应用

#ifndef MYTIME_H
#define MYTIME_H#include <iostream>using namespace  std;class Time
{
private:int hours;int minutes;public:Time();Time(int h, int m = 0);void AddMin(int m);void AddHr(int h);void Reset(int h = 0, int m = 0);Time operator+(const Time& t) const;Time operator-(const Time& t) const;Time operator*(double mult) const;void Show() const;
};#endif // MYTIME_H
#include "mytime.h"Time::Time()
{hours = minutes = 0;
}Time::Time(int h, int m)
{hours = h;minutes = m;
}void Time::AddMin(int m)
{minutes += m;hours += minutes/60;minutes %= 60;
}void Time::AddHr(int h)
{hours += h;
}void Time::Reset(int h, int m)
{hours = h;minutes = m;
}//运算符+重载
Time Time::operator+(const Time &t) const
{Time sum;sum.minutes = minutes + t.minutes;sum.hours = hours + t.hours + sum.minutes/60;sum.minutes %= 60;return sum;
}Time Time::operator-(const Time& t) const
{Time diff;int tot1, tot2;tot1 = t.minutes + 60 * t.hours;tot2 = minutes + 60 * hours;diff.minutes = (tot2 - tot1) % 60;diff.hours = (tot2 - tot1) / 60;return diff;
}Time Time::operator*(double mult) const
{Time result;long totalminutes = hours * mult *60 + minutes * mult;result.hours = totalminutes / 60;result.minutes = totalminutes % 60;return result;
}void Time::Show() const
{cout << hours << " hours, " << minutes << " minutes.\n";
}
#include <iostream>
#include "mytime.h"using namespace std;int main()
{Time weeding(4, 35);Time waxing(2, 47);Time total;Time diff;Time adjusted;cout << "weeding time =  ";weeding.Show();cout << endl;cout << "waxing time =  ";waxing.Show();cout << endl;cout << "total working time =  ";total = weeding + waxing;total.Show();cout << endl;diff = weeding - waxing;cout << "weeding time - waxing time = ";diff.Show();cout << endl;adjusted = total * 1.5;cout << "adjusted work time = ";adjusted.Show();cout << endl;return 0;
}

输出结果

weeding time =  4 hours, 35 minutes.waxing time =  2 hours, 47 minutes.total working time =  7 hours, 22 minutes.weeding time - waxing time = 1 hours, 48 minutes.adjusted work time = 11 hours, 3 minutes.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三步,金蝶K3的数据可视化了

数据可视化的一大特点就是“一图胜千言”&#xff0c;没什么能比图表更直观展现数据的了。那&#xff0c;金蝶K3系统上那海量数据能不能也做成数据可视化报表&#xff1f;操作复杂吗&#xff0c;难度大吗&#xff1f; 换了别的软件来做&#xff0c;操作多、难度大是板上钉钉&a…

排序算法-堆积树排序法(HeapSort)

目录 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 2、算法分析 3、C代码 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 堆积树排序法是选择排序法的改进版&#xff0c;可以减少在选择排序法中的比较次数&#xff0c;进而减少排序…

计算机服务器中了devos勒索病毒怎么办?企业数据库被encryped

计算机网络技术的不断发展&#xff0c;为人们的生活提供了更多的帮助&#xff0c;但也为我们的企业带来了更多的数据安全威胁。近期&#xff0c;云天数据恢复中心收到很多企业的求助&#xff0c;企业的数据库遭到了devos后缀勒索病毒攻击&#xff0c;导致企业数据库无法打开&am…

TypeScript 基础学习

第一节&#xff1a;为什么使用ts? js 只能是动态类型检查&#xff0c;ts 是静态类型检查 第二节&#xff1a;优化编译 生成的配置文件名字叫tsconfig 第三节&#xff1a;变量类型 联合类型 可选属性 类型别名 接口 接口和类型别名的区别 接口扩展 类型扩展 类型断言&#…

为爱出发,与善同行丨纬创软件2023北京善行者圆满收官

2023年10月21日&#xff0c;北京善行者徒步活动在昌平正式开走。800支队伍3200名善行者队员进行32公里的公益行走。纬创软件组建「北京台协纬创软件队」&#xff0c;4名队员踏上32公里的征程&#xff0c;通过徒步筹款的方式传递善行理念&#xff0c;为贫困山区的孩子们建立“爱…

Linux redis 安装

1、解压 tar -zxvf redis-5.0.10.tar.gz 2、cd /data/redis-5.0.10 文件夹 3、make 等待make命令执行完成即可。 make命令报错&#xff1a;cc 未找到命令&#xff0c;系统中缺少gcc&#xff0c;执行命令安装 gcc&#xff1a; yum -y install gcc automake autocon…

内网穿透的应用-Linux JumpServer堡垒机:安全远程访问解决方案

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

C#,数值计算——分类与推理,基座向量机(SVM,Support Vector Machines)的计算方法与源程序

把 Support Vector Machines 翻译成 支持向量机 是书呆子翻译。基座向量机 不好吗。 1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Support Vector Machines /// </summary> public class Svm { priv…

【SpringCloudNetflix】一图理解Spring Cloud Netflix解决了那些微服务问题?

什么是微服务理解&#xff1a; SpringCloudNetflix解决的问题理解&#xff1a; SpringCloudNetflix核心点&#xff1a; 注册中心&#xff1a;Eureka负载均衡&#xff1a;Ribbon、Feign服务熔断&#xff1a;Hystrix服务降级&#xff1a;Hystrix服务监控&#xff1a;Hystrix Da…

【工具问题】IDEA每次关闭的时候都会弹框显示closing project,然后弹框持续很久就像卡住了

idea关闭的时候出现问题 问题展示为什么会出现这种情况怎么解决 问题展示 我idea已经关闭了&#xff0c;但是这个弹框要持续很久才能关闭 为什么会出现这种情况 我的plugins原本是加载不出来的&#xff0c;所以我按照网上说法去做 怎么解决 file->setting,再如图选择…

menuconfig 图形化配置原理说明三

一. 简介 本文继续简单了解一下&#xff0c;uboot的图形化配置原理。具体了解 Kconfig语法。 之前文章了解了几个 Kconfig语法。地址如下&#xff1a; menuconfig 图形化配置原理说明二-CSDN博客 二. menuconfig 图形化配置之 Kconfig语法 1. config 条目 顶层 Kconfig …

一文详解Docker镜像

目录 镜像基本介绍 镜像概述 DockerHub Docker四种制作镜像方式 Docker镜像常见操作命令 docker images : 查看本地储存的 Docke镜像 docker pull : 拉取自己需要的镜像 docker rmi : 删除镜像 docker save &#xff1a;镜像 保存成 tar 包 docker import &#…

Spring Boot 依赖注入实现原理

Spring Boot 是 Spring 框架的扩展&#xff0c;它简化了 Spring 应用程序的创建和部署。在 Spring Boot 中&#xff0c;依赖注入是实现对象间解耦的重要技术&#xff0c;它使得应用程序的各个组件之间可以通过依赖注入来相互协作&#xff0c;提高了代码的可维护性和可重用性。 …

shell_53.理解Linux输入和输出

理解输入和输出 1.两种显示脚本输出的方法。 (1)在显示器屏幕上显示输出。 (2)将输出重定向到文件中。 2.标准文件描述符 Linux 系统会将每个对象当作文件来处理&#xff0c;这包括输入和输出。Linux 用文件描述符来标识每个文件对象。 文件描述符是一个非负整数&#xff0c;唯…

PyTorch卷积神经网络各层实现与介绍

本文将讲解&#xff0c;PyTorch卷积神经网络各层实现与介绍&#xff0c;包括&#xff1a;基本骨架–nn.Module的使用、卷积操作、卷积层、池化层、激活函数、全连接层的介绍。 &#x1f61c; 对于相关原理&#xff0c;可以跳转&#x1f449;卷积神经网络CNN各层基本知识 &…

【shell】read -t -n1

if read -t 5 -p "Please enter your name:" name thenecho "Hello, $name, welcome to my script" else#起到换行的作用echo#输入计数 -n1read -n1 -p "Do you want to continue [Y/N]?" answercase $answer inY | y) echoecho "Fine, co…

封装withRouter并且使用

在react后续的版本中,路由组件中props找不到router相关的方法,这就需要自己去封装一个withRouter插件,给路由组件的props上配置原来的属性,方便路由组件中进行路由操作. 代码如下: 新建一个withRouter.jsx文件 import {useLocation,useNavigate,useParams,} from "reac…

vue源码分析(二)——vue的入口发生了什么

文章目录 前言&#xff08;1&#xff09;vue 项目构建的时候&#xff0c;通过package.json文件看到构建入口&#xff08;2&#xff09; 构建入口页面&#xff1a;导入同级模块config的getAllbuilds方法&#xff08;3&#xff09; 通过传入参数中的builds对象使用map获取&#x…

简化路径(C++解法)

题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1…

Git(二)版本控制、发展历史、初始化配置、别名

目录 一、版本控制1.1 为什么要使用版本控制&#xff1f;1.2 集中化的版本控制系统1.3 分布式的版本控制系统1.3 两种版本控制系统对比集中式&#xff08;svn&#xff09;分布式&#xff08;git&#xff09; 二、发展历史三、初始化配置3.1 配置文件3.2 配置内容 四、别名 官网…