C ++中后缀增量运算符中int变量的含义

时间:2013-07-30 10:28:54

标签: c++ operator-overloading

我有这段代码:

class LazyStream {
    ostream& output;
    std::list<string> pending;
public:
    //...
    LazyStream operator++(int n = 0){
        LazyStream other(output);
        if (n>0) output << "<#" << n << ">";
        output << pending.pop_front();
        return other;
    }

我不明白为运算符++获取int值的含义。我虽然只是表明操作符是后缀。操作员如何获得号码? 有人能举个例子吗?

由于

2 个答案:

答案 0 :(得分:3)

嗯,这是我第一次见到int违约。

正如您所指出的,使用“虚拟”int参数 将post-fix运算符与前缀区分开来。除了那个 这不是一个假人:你写的时候:

myVar ++;

myVar有一个用户定义的postfix ++,即编译器 实际上将其称为:

myVar.operator++( 0 );

没有什么可以阻止你写作:

myVar.operator++( 42 );

(当然,必须这样做,就像在这种情况下,有点失败 运算符重载的目的。)

答案 1 :(得分:2)

如果使用函数调用语法来调用该运算符,显然可以传递该参数。此代码使用gcc完全编译并输出42

#include <iostream>

struct Stream {
    Stream operator++(int n)
    {
        std::cout << n;
        return *this;
    }
};

int main()
{
    Stream s;
    s.operator++(42);
}

如果我给它默认值,它会给出一个警告(带有-pedantic标志)但它不能有一个警告。这有点意义,因为如果你还定义了前缀增量,那么调用s.operator++()将是不明确的。但是,我没有在标准中发现明确禁止默认值的任何内容。