码迷,mamicode.com
首页 > 其他好文 > 详细

自增自减运算符重载

时间:2019-08-10 19:12:16      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:opera   操作   r++   return   重载   区分   后缀   names   而不是   

递增运算符(++)和递减运算符(--)是C++语言中两个重要的一元运算符。

/***
addMyself.cpp
***/
#include<iostream>
using namespace std;

class Time
{
    private:
        int hours;
        int minutes;
    public:
        Time()
        {
            hours = 0;
            minutes = 0;
        }
        Time(int h,int m)
        {
            hours = h;
            minutes = m;
        }

        void displayTime()
        {
            cout << "H: " << hours << " M" << minutes << endl;
        }
        //重载前缀递增运算符
        Time operator++()
        {
            ++minutes;
            if(minutes >= 60)
            {       
                ++hours;
                minutes -= 60;
            }
            return Time(hours,minutes);
        }
        //重载后缀递增运算符
        Time operator++(int)
        {
            Time T(hours,minutes);
            ++minutes;
            if(minutes >= 60)
            {
                ++hours;
                minutes -= 60;
            }
            return T;
        }
};

int main()
{
    Time T1(11,59),T2(10,40);

    ++T1;
    T1.displayTime();
    ++T1;
    T1.displayTime();

    T2++;
    T2.displayTime();
    T2++;
    T2.displayTime();
    return 0;
}

运行结果:

exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ addMyself.cpp -o addMyself

exbot@ubuntu:~/wangqinghe/C++/20190808$ ./addMyself

H: 12 M0

H: 12 M1

H: 10 M41

H: 10 M42

 

注意:int在括号是为了向编译器说明这是一个后缀形式,而不是表示整数。

前缀形式重载调用Check operator++(),后缀形式重载调用operator++(int)

/***
addOver.cpp
***/
#include<iostream>
using namespace std;

class Check
{
    private:
        int i;
    public:
        Check():i(0){};
        Check operator++ ()
        {
            Check temp;
            temp.i = ++i;
            return temp;
        }

        Check operator ++ (int)
        {
            Check temp;
            temp.i = i++;
            return temp;
        }

        void Display()
        {
            cout << "i = " << i << endl;
        }
};

int main()
{
    Check obj1,obj;
    obj.Display();
    obj1.Display();

    obj1 = ++ obj;
    obj.Display();
    obj1.Display();

    obj1 = obj++;
    obj.Display();
    obj1.Display();
    
    return 0;
}

运行结果:

exbot@ubuntu:~/wangqinghe/C++/20190808$ ./addOver

i = 0

i = 0

i = 1

i = 1

i = 2

i = 1

 

递减和递增运算符重载:

  1. 递增和递减一般是对改变对象的状态,所以一般是重载为成员函数。
  2. 重载递增递减,一定要和指针的递增递减区分。因为这里重载操作的是对象,而不是指针(由于指针是内置类型,指针的递减递增是无法重载的),所以一般情况的递增递减是操作对象内部的成员变量。
  3. 递增和递减分为前置和后置情况,a = ++b;(前置), a = b++。因为符号一样,所以给后置版本加一个int形参作为区分。这个形参是0,但是在函数体中用不到,只是为了区分前置后置而已。

自增自减运算符重载

标签:opera   操作   r++   return   重载   区分   后缀   names   而不是   

原文地址:https://www.cnblogs.com/wanghao-boke/p/11326019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!