C++ Primer Plus学习:第十一章 使用类(1)

本文详细介绍了C++中操作符重载的概念与实现方法,并通过具体案例演示了如何为自定义类重载加法、减法及乘法操作符。

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

操作符重载
  函数重载定义:名称相同但特征(参数列表)不同的函数
  eg

    mytime1.h

#ifndef MYTIME1_H_
#define MYTIME1_H_
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;
             void Show()const;
      };
#endif


    mytime1.cpp

#include <iostream>
#include "mytime1.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 + sum.minutes/60;
     sum.minutes %= 60;
     return sum;
     }
void Time::Show()const
{
     std::cout<<hours<<" hours. "<<minutes<<" minutes.";
     }


    usetime1.cpp

#include <iostream>
#include "mytime1.h"

int main()
{
    using std::cout;
    using std::endl;
    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 + fixing;
    cout<<"coding + fixing = ";
    total.Show();
    cout<<endl;
    
    Time morefixing(3,28);
    cout<<"more fixing time = ";
    morefixing.Show();
    cout<<endl;
    total = morefixing.operator+(total);
    cout<<"morefixing.operator+(total) = ";
    total.Show();
    
    system("pause");
    return 0;
    }


  限制
    重载后的操作符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符 不能将减法操作符(-)重载为计算两个double值的和,而不是它们的差。
    使用操作符时不能违反操作符原来的句法规则。
    不能定义新的操作符
    不能重载下面的操作符
      sizeof
      .成员操作符
      .*成员指针操作符
      ::作用域操作符
      ?:条件操作符
      typeid一个RTTI操作符
      const_cast强制类型转换操作符
      dynamic_cast强制类型转换操作符
      reinterpret_cast强制类型转换操作符
      static_cast强制类型转换操作符
  eg

    mytime2.h

#ifndef MYTIME2_H_
#define MYTIME2_H_

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.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 - tot2)/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
{
     std::cout<<hours<<" hours, "<<minutes<<" minutes.";
     }


    usetime.cpp

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

int main()
{
    using std::cout;
    using std::endl;
    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<<"toal work time = ";
    total = weeding + waxing;
    total.Show();
    cout<<endl;
    
    cout<<"weeding time - waxing time = ";
    diff = weeding - waxing;
    diff.Show();
    cout<<endl;
    
    adjusted = total*1.5;
    cout<<"adjusted word time = ";
    adjusted.Show();
    cout<<endl;
    
    system("pause");
    return 0; 
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值