点击这里给我发消息 点击这里给我发消息

C++单目运算符重载

添加时间:2013-12-7
    相关阅读: 程序 C++ 系统
 

例10.5 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算?要求输出分和秒的值?
#include <iostream>
using namespace std;
class Time
{
   public:
   Time( ){minute=0;sec=0;}  //默认构造函数
   Time(int m,int s):minute(m),sec(s){ } //构造函数重载
   Time operator++( ); //声明运算符重载函数
   void display( ){cout<<minute<<″:″<<sec<<endl;} //定义输出时间函数
   private:
   int minute;
   int sec;
};
Time Time∷operator++( )  //定义运算符重载函数
{
   if(++sec>=60)
   {
      sec-=60; //满60秒进1分钟
      ++minute;
   }
   return *this;  //返回当前对象值
}
int main( )
{
   Time time1(34,0);
   for (int i=0;i<61;i++)
   {
      ++time1;
      time1.display( );
   }
   return 0;
}
运行情况如下:
34:1
34:2

34:59
35:0
35:1 (共输出61行)

可以看到: 在程序中对运算符“++”进行了重载,使它能用于Time类对象?“++”和“--”运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?

针对“++”和“--”这一特点,C++约定: 在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数?

例10.6 在例10.5程序的基础上增加对后置自增运算符的重载?修改后的程序如下:
#include <iostream>
using namespace std;
class Time
{
   public:
   Time( ){minute=0;sec=0;}
   Time(int m,int s):minute(m),sec(s){}
   Time operator++( );//声明前置自增运算符“++”重载函数
   Time operator++(int);//声明后置自增运算符“++”重载函数
   void display( ){cout<<minute<<″:″<<sec<<endl;}
   private:
   int minute;
   int sec;
};

Time Time∷operator++( )//定义前置自增运算符“++”重载函数
{
   if(++sec>=60)
   {
      sec-=60;
      ++minute;
   }
   return *this;//返回自加后的当前对象
}

Time Time∷operator++(int)//定义后置自增运算符“++”重载函数
{
   Time temp(*this);
   sec++;
   if(sec>=60)
   {
      sec-=60;
      ++minute;
   }
   return temp;  //返回的是自加前的对象
}

int main( )
{
   Time time1(34,59),time2;
   cout<<″ time1 : ″;
   time1.display( );
   ++time1;
   cout<<″++time1: ″;
   time1.display( );
   time2=time1++;  //将自加前的对象的值赋给time2
   cout<<″time1++: ″;
   time1.display( );
   cout<<″ time2 :″;
   time2.display( ); //输出time2对象的值
}

请注意前置自增运算符“++”和后置自增运算符“++”二者作用的区别?前者是先自加,返回的是修改后的对象本身?后者返回的是自加前的对象,然后对象自加?请仔细分析后置自增运算符重载函数?

运行结果如下:
time1 : 34:59(time1原值)
++time1: 35:0 (执行++time1后time1的值)
time1++: 35:1 (再执行time1++后time1的值)
time2 : 35:0 (time2保存的是执行time1++前time1的值)

可以看到: 重载后置自增运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用?编译系统在遇到重载后置自增运算符时,会自动调用此函数?

C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream?cin和cout分别是istream类和ostream类的对象?在类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据?因此,在本书前面几章中,凡是用“cout<<”和“cin>>”对标准类型数据进行输入输出的,都要用#include <iostream>把头文件包含到本程序文件中

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册