Time类是一个用于计算时间的类,其原型如下:
程序清单11.1 mytime0.h

// mytime0.h -- Time class before operator overloading
#ifndef MYTIME0_H_
#define MYTIME0_H_ class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m = );
void AddMin(int m);
void AddHr(int h);
void Reset(int h = , int m = );
Time Sum(const Time & t) const;
void Show() const;
};
#endif // MYTIME0_H_

Time类提供了用于调整和重新设置事时间、显示时间、将两个事件相加的方法。程序清单11.2列出了方法定义。
程序清单11.2 mytime0.cpp

// mytime0.cpp -- implementing Time methods
#include <iostream>
#include "mytime0.h" 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;
} Time Time::Sum(const Time & t) const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / ;
sum.minutes %= ;
return sum;
} void Time::Show() const
{
std::cout << hours << " hours, " << minutes << "minutes";
}

最后,程序清单11.3对Time类中计算时间总和的部分进行了测试。
程序清单11.3 usetime0.cpp

// usetime0.cpp -- using the first draft of the Time class
// conpile usetime0.cpp and mytime0.cpp together
#include <iostream>
#include "mytime0.h" int main()
{
using std::cout;
using std::endl;
Time planing;
Time coding(, );
Time fixing(, );
Time total; cout << "planing time = ";
planing.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 ;
}

下面是程序清单11.1、程序清单11.2和程序清单11.3组成的程序的输出:

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

11.2.1 添加加法运算符
将Time类转换为重载的加法运算符很容易,只要将Sum()的名称改为operator +()即可。这样做是对的,只要把运算符(这里为+)防盗operator的后面,并将结果用作方法名即可。在这里,可以在标识符中使用字幕、数字或下划线之外的其他字符。程序清单11.4和程序清单11.5反映了这些细微的修改。
程序清单11.4 mytime1.h

// mytime1.h -- Time class before operator overloading
#ifndef MYTIME1_H_
#define MYTIME1_H_ class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m = );
void AddMin(int m);
void AddHr(int h);
void Reset(int h = , int m = );
Time operator + (const Time & t) const;
void Show() const;
};
#endif // MYTIME1_H_

程序清单11.5 mytime1.cpp

// mytime1.cpp -- implementing Time methods
#include <iostream>
#include "mytime1.h" 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;
} 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;
} void Time::Show() const
{
std::cout << hours << " hours, " << minutes << " minutes";
}

用一个usetime1.cpp做测试,得到和上述一样的结果。

usetime1.cpp:

// usetime1.cpp -- using the first draft of the Time class
// conpile usetime0.cpp and mytime0.cpp together
#include <iostream>
#include "mytime1.h" int main()
{
using std::cout;
using std::endl;
Time planing;
Time coding(, );
Time fixing(, );
Time total; cout << "planing time = ";
planing.Show();
cout << endl; cout << "coding time = ";
coding.Show();
cout << endl; cout << "fixing time = ";
fixing.Show();
cout << endl; total = coding + fixing;
cout << "coding.Sum(fixing) = ";
total.Show();
cout << endl; return ;
}

和Sum()一样,operator+()也是由Time对象调用的,它将第二个Time对象作为参数,并返回一个Time对象。因此,可以像调用Sum()那样来调用operator+()方法:

total = coding.operator+(fixing);    // function notation

但将该方法命令为operator+()后,也可以使用运算符表示法:

total = coding + fixing;        // operator notation

这两种表示法都将调用operator+()方法。注意,在运算符表示法中,运算符左侧的对象(这里为coding)是调用对象,运算符右边的对象(这里为fixing)是作为参数被传递的对象。

计算时间:一个C++运算符重载示例的更多相关文章

  1. YTU 2617: B C++时间类的运算符重载

    2617: B C++时间类的运算符重载 时间限制: 1 Sec  内存限制: 128 MB 提交: 284  解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...

  2. 问题 C: B C++时间类的运算符重载

    题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为表示时间的小时(hour).分(minute),秒(second). 重载运算符“+”,使之能用于时间对象的加法运算:重载运算符 ...

  3. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  4. C++运算符重载详解

    1.什么是运算符重载 运算符重载是一种函数重载. 运算符函数的格式:operatorop(argument-list)例如,operator+()重载+运算符.其中的op,必须是有效的C++运算符,如 ...

  5. ylbtech-LanguageSamples-OperatorOverLoading(运算符重载)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-OperatorOverLoading(运算符重载) 1.A,示例(Sample) 返回 ...

  6. C++:运算符重载函数之友元运算符重载

    5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算 ...

  7. C++基础——运算符重载友元函数示例

    一.前言 其实本人学习C++的目的,只是为了体会OOP设计思想,并为利用System Verilog验证复杂设计做准备.如果想要真正做点软件方面项目级的东西,还需要掌握其他高级语言和库.框架等知识.因 ...

  8. Java 原始数据类型的计算:运算符重载(Operator Overload)和类型转换(Type Conversion)

    原文阅读:<算法(第四版)>第一章 第一节:基础编程模型 有没有在面试的时候被问到:下面这几行代码的执行结果是什么?依据是什么? System.out.println (5/3); Sys ...

  9. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

随机推荐

  1. R ggplot2 线性回归

    摘自  http://f.dataguru.cn/thread-278300-1-1.html library(ggplot2) x=1:10y=rnorm(10)a=data.frame(x= x, ...

  2. eql高可用部署方案

    运行环境 服务器两台(后面的所有配置案例都是以10.96.0.64和10.96.0.66为例) 操作系统CentOS release 6.2 必须要有共同的局域网网段 两台服务器都要安装keepali ...

  3. 用Lucene对文档进行索引搜索

    问题 现在给出很多份文档,现在对某个搜索词感兴趣,想找到相关的文档. 简单搜索 一种简单粗暴的做法是: 1.读取每个文档:2.找到其中含有搜索词的文档:3.对找到的文档中搜索词出现的次数统计:4.根据 ...

  4. Sencha Touch2 工作笔记

    Sencha Touch2 工作笔记 Ext.dataview.List activate( this, newActiveItem, oldActiveItem, eOpts ) Fires whe ...

  5. HTML——动画效果:图片循环横向播放

    一.html <!DOCTYPE HTML> <html> <head> <title>Home</title> <link href ...

  6. poll--wait for some event on a file descriptor

    poll同select,用于监控file descriptor事件,推荐用poll的升级版epool来实现功能,但在简单应用中使用poll更方便. #include <poll.h> in ...

  7. flv网页视频播放

    今天需要用到网页视频播放功能,找了一下,发现flowplayer很好用,写了个dome需要的同学,去下载咯 http://download.csdn.net/detail/jine515073/770 ...

  8. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

  9. 用javascript将数据导入Excel

    网上收集的代码 <input type="button" name="out_excel" onclick="AutomateExcel();& ...

  10. jQuery 工具大搜集

    jQuery 是一个非常棒的类库,但是为了保证代码的干净以及代码的精简,它只提供最核心的功能.所以就有了很多其他的工具来丰富jQuery的功能.我在使用这些工具的时候发现我常常重复的编写一些代码,所以 ...