首页 > 其他分享 >第11章 使用类——运算符重载(二)运算符重载限制

第11章 使用类——运算符重载(二)运算符重载限制

时间:2024-03-31 22:12:47浏览次数:10  
标签:11 hours const int 运算符 Time 重载 minutes

本文章是作者根据史蒂芬·普拉达所著的《C++ Primer Plus》而整理出的读书笔记,如果您在浏览过程中发现了什么错误,烦请告知。另外,此书由浅入深,非常适合有C语言基础的人学习,感兴趣的朋友可以自行阅读此书籍。

运算符重载限制

可以被重载的运算符有:
+ - * / % ^
& | ~= ! = <
> += -= *= /= %=
^= &= |= << >> >>=
<<= == != <= >= &&
|| ++ -- , ->* ->
() [] new delete new[] delete

以下是C++对用户定义的运算符重载的限制:

  1. 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。
    例如,不能将减法运算符(-)重载为计算两个double值得和。
  2. 使用运算符时不能违反运算符原来的句法规则。
    例如,不能将求模运算符(%)重载成使用一个操作数。
  3. 不能创建新运算符。
    例如,不能定义operator**()函数来表示求幂。
  4. 不能重载下面的运算符。
    sizeof:sizeof运算符。
    不能重载的运算符 说明
    sizeof sizeof运算符
    . 成员运算符
    .* 成员指针运算符
    :: 作用域解析运算符
    ?: 条件运算符
    typeid 一个RTTI运算符
    const_cast 强制类型转换运算符
    dynamic_cast 强制类型转换运算符
    reinterpret_cast 强制类型转换运算符
    static_cast 强制类型转换运算符
  5. 大多数运算符都可以通过成员或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载。
    只能通过成员函数重载的运算符 说明
    = 赋值运算符
    () 函数调用运算符
    [] 下标运算符
    -> 通过指针访问类成员的运算符

对上一篇文章所设计的类,我们可以继续完善,比如,有可能我们需要将两个时间相减或将时间乘以一个因子,这需要重载减法和乘法运算符。
因此在Time类中添加如下两个方法:

Time operator-(const Time& t) const;
Time operator*(double n) const;

类声明如下:

//mytime2.hpp
#ifndef _MYTIME0_HPP_
#define _MYTIME0_HPP_
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 n) const;
  void Show() const;
};
#endif

类方法实现如下:

//mytime2.cpp
#include <iostream>
#include "mytime2.hpp"

Time::Time()
{
  hours = minutes = 0;
}

Time::Time(int h, int m)
{
  hours = h;
  minutes = m;
}

void Time::AddMin(int m)
{
  int total_minutes  = minutes + m;
  minutes = total_minutes % 60;
  hours += total_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 tmp;
  int total_minutes = t.minutes + minutes;
  tmp.minutes = total_minutes % 60;
  tmp.hours += hours + t.hours + total_minutes / 60;
  return tmp;
}
Time Time::operator-(const Time& t) const
{
  Time tmp;
  int result = (minutes + hours*60) - (t.minutes + t.hours*60);

  if (result > 0)
  {
    tmp.hours = result / 60;
    tmp.minutes = result % 60;
  }

  return tmp;
}

Time Time::operator*(double n) const
{
  Time tmp;
  int total_minutes = minutes + hours * 60;
  int result = total_minutes * n;
  tmp.hours = result / 60;
  tmp.minutes = result % 60;
  return tmp;
}

void Time::Show() const
{
  std::cout  <<  hours << " hours "  << minutes << " minutes" << std::endl;

}

使用类:

//usetime2.cpp

#include <iostream>
#include "mytime2.hpp"

int main()
{
  using std::cout;
  using std::endl;
  
  Time time_work;
  Time time_work_morning(2, 35);
  Time time_work_afternoon(4, 40);
  Time time_work_evening(2, 30);

  cout << "morning work time: ";
  time_work_morning.Show();
  cout << endl;
  
  cout << "afternoon work time: ";
  time_work_afternoon.Show();
  cout << endl;
  
  cout << "evening work time: ";
  time_work_evening.Show();
  cout << endl;

  time_work = time_work_morning + time_work_afternoon+ time_work_evening;
  cout << "total time: ";
  time_work.Show();
  cout << endl;
  
  time_work = time_work * 5;
  cout << "five days total time: ";
  time_work.Show();
  cout << endl;

  time_work = time_work_afternoon - time_work_morning;
  cout << "time_work(afternoon - morning) time: ";
  time_work.Show();
  cout << endl;

  return 0;
}

程序结果如下:

morning work time: 2 hours 35 minutes

afternoon work time: 4 hours 40 minutes

evening work time: 2 hours 30 minutes

total time: 9 hours 45 minutes

five days total time: 48 hours 45 minutes

time_work(afternoon - morning) time: 2 hours 5 minutes

标签:11,hours,const,int,运算符,Time,重载,minutes
From: https://www.cnblogs.com/superbmc/p/18104873

相关文章

  • 代码随想录算法训练营第11天 | 栈和队列
    20.有效的括号遇到左括号入栈,遇到右括号弹出boolisValid(strings){ stack<char>kuohao; charc; for(chara:s){ switch(a) { case'(': case'{': case'[': kuohao.push(a); break; case')': case'......
  • 代码随想录第11天: 栈的应用
    20.有效的括号力扣题目链接(opensnewwindow)给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例1:输入:“()......
  • 洛谷P1102 A-B数对
    双指针做法:  反过来,从后往前看也是一样的:#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=2e5+5;int......
  • Java(2)之变量,数据类型,运算符
    1、标识符在java中标识符是由字母数字下划线,美元符号组成(其中数字没办法作首)在java中是区分大小写的。2、关键字关键字是在java中赋予了特殊的含义的字符,只能用于特定地方例如包package类class接口interface引用:this,supe,创建对象:new等等关键字引用需要注意大小写,且......
  • 111
    1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领域)?•我还是比较喜欢的,并没有后悔,喜欢一些自动化控制的领域,他需要用到计算机,尤其是编程,这项技能必不可少。......
  • 11
    请阅读北航陈彦吉同学的这篇博客中(地址:https://www.cnblogs.com/ChildishChange/p/7363123.html)的各参考资料,并回答如下问题:1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机......
  • 111
    1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?作为一个学生,回顾我过去将近三年的学习经历是一段充满挑战和成长的旅程。当初我报考计算机专业时,我对计算机确实有着浓厚的兴趣。我喜欢探索新技术,解决问题,并且觉得计算机领域充满了无限的可能性。在......
  • 111
    请阅读北航陈彦吉同学的这篇博客中(地址:https://www.cnblogs.com/ChildishChange/p/7363123.html)的各参考资料,并回答如下问题:1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机......
  • [C++11]右值引用
    阅读导览:通过左值、右值的基础概念来引出左值引用和右值引用知道左值引用和右值引用后,先了解他们为什么能实现(底层原理)熟悉了解左值引用的优点和缺陷并给出疑问,进而引出右值引用出现的意义以及如何解决左值引用的疑问最后从多个方面再次了解右值引用基础概念右值、左值......
  • 20211110lyxDER编码
    一、任务详情参考附件中图书p120中7.1的实验指导,完成DER编码。Name实例中,countryName改为"CN",organizationName="你的学号"commonName="你的姓名拼音"。用echo-n-e"编码">你的学号.der中,用OpenSSLasn1parse分析编码的正确性。提交编码过程文档(推荐markdown格式)。......