重载运算符而不传递参数

时间:2018-04-16 08:39:14

标签: c++ operator-overloading post-increment pre-increment

我正在尝试实现一个时间类,它设置时间,打印它并增加一秒钟。我想通过重载++运算符来实现它,并且只有在参数列表中定义参数时它才能正常工作。如何在不定义任何参数的情况下使其工作,因为我知道它将当前时间增加一秒而且我不需要任何参数?

#include <iostream>

using namespace std;

class time
{
    int h,m,s;
public:
    time(int a, int b, int c);
    void printtime();
    time& operator++(int);
};

[...]

time& time::operator++(int x)
{
    s++;
if (s>59) {
    m++;
    s -= 60;
    if (m>59) {
        h++;
        m -= 60;
        if (h>23) {
            h = m = s = 0;
        }
    }
}
return *this;
}

int main()
{
try {
time now(22,58,59);
now.printtime();
now++;
now.printtime();
}
catch(const char* u) {
    cout << u << endl;
}

return 0;
}

另外,我需要实现postfix运算符,这会增加时间,但只能在打印旧时间之后,以便

time now(2,23,59);
(now++).printtime();

将打印2:23:59,但之后现在的值将是3,0,0。如何实现前缀和后缀++运算符,并在main函数中调用它们时有所作为呢?

1 个答案:

答案 0 :(得分:3)

问题是有两个叫做++的运算符。一个是预增量,一个是后增量。

为了区分它们,C ++的创建者认为后增量版本需要&#34; int&#34;参数。它没有被使用,但它需要在那里,否则它是一个预增量运算符。

如果要删除参数,可以像这样使用它:

++now;

此外,后增量版本确实需要返回结构的COPY,其状态与增量之前的状态相同。这是运营前和运营后的主要区别。实现pre运算符要简单得多,所以如果你需要它,那就是你应该使用的。

为了完整性,以下是运算符以及如何为类T编写它们:

T& T::operator++();   [pre-increment]
T& T::operator--();   [pre-decrement]
T T::operator++(int); [post-increment]
T T::operator--(int); [post-decrement]

请注意,预版本返回对对象的引用,而post-version返回副本(不是引用)。该副本应包含增量/减量之前的值。