c++primer plus清单11.10 ,11.11 , 11.12

本文深入探讨了C++中自定义时间类的实现,包括加法、减法和乘法运算符的重载,以及如何正确处理输出流对象的引用返回,避免编译错误。文章详细解释了为何在重载输出流操作符时必须返回引用,而非值,以防止对象拷贝的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先清单11.10
#ifndef MYTIME3_H_
#define MYTIME3_H_
#include
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;
friend Time operator (double n, const Time &t)
{
return t
n;
};
friend std::ostream & operator <<(std::ostream &os, const Time &t);
};
#endif

其次11.11
// stdafx.cpp : 只包括标准包含文件的源文件
// s a f e p r o j e c t n a m e safeprojectname safeprojectname.pch 将作为预编译标头
// stdafx.obj 将包含预编译类型信息

#include “stdafx.h”
#include “mytime3.h”

// TODO: 在 STDAFX.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 = hoursmult * 60 + minutesmult;
result.hours = totalminutes /60;
result.minutes = totalminutes % 60;
return result;
}

std::ostream & operator<<(std::ostream & os, const Time & t)
{
os<< t.hours << "hours, " << t.minutes << “minutes”;
return os;
}
最后11.12
// stdafx.cpp : 只包括标准包含文件的源文件
// s a f e p r o j e c t n a m e safeprojectname safeprojectname.pch 将作为预编译标头
// stdafx.obj 将包含预编译类型信息

#include “stdafx.h”
#include “mytime3.h”

// TODO: 在 STDAFX.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 = hoursmult * 60 + minutesmult;
result.hours = totalminutes /60;
result.minutes = totalminutes % 60;
return result;
}

std::ostream & operator<<(std::ostream & os, const Time & t)
{
os<< t.hours << "hours, " << t.minutes << “minutes”;
return os;
}
结果 图示
在这里插入图片描述
今天打的时候不小心把重载*第一个&漏了,然后报错
图示
在这里插入图片描述

在这里插入图片描述
运行结果
在这里插入图片描述
开始很奇怪,就是为什么要引用,return,不是会返回一个副本的吗,拷贝的对象不也一样可以用吗,反正也不是值,就是一个输出流对象拷贝就拷贝,开始是这么想的,但是当我查了一些资料后,别人说,输入流的对象是无法被拷贝的,应该没有对应的复制构造函数,同理,输出流对象也是如此,不然你看我试的,如果他有对应的复制构造函数,那早就复制了。可惜他没有。而一旦返回非引用就要拷贝,所以是显然无法编译通过的,我也是第一次知道,输入流输出流对象没有复制构造函数,
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值