为什么我们必须从一元前缀运算符重载返回const引用

时间:2016-02-24 02:47:04

标签: c++

我对前缀运算符重载有一个疑问。

我的示例程序:

class ABC {
    int i;
public:
    const ABC& operator++() { i=i+1; return *this;}
};

int main() {
    ABC ob ; //let value of i =5;
    ++ob;  // value of i will be 6
    return 0;
}

但我可以像下面那样重载

来做同样的事情
void operator++() { i=i+1;}

这在调用++ob

时给出了相同的结果

APMK ++ob转换为ob.operator++()

我怀疑返回值会发生什么。编译器是否创建了如下代码:

ob = ob.operator++();

提前致谢

2 个答案:

答案 0 :(得分:1)

  

为什么我们必须从一元前缀运算符重载返回const引用

你不必。通常,您返回非const引用,但您可以返回任何内容。你不应该,但你可以。内置的预增量工作如何返回非const引用,因此最有意义的是。

答案 1 :(得分:0)

返回对象引用的原因是使行为与整数相同(对于内置类型)。

std::cout << ++i;
std::cout << i++;

如果i是一个整数,这将有效。如果您返回对象的引用(假设您已为您的类定义operator<<),则此操作仅适用于类。

class ABC {
    int i;
public:
    ABC(int x = 0) : i(x) {}
    const ABC& operator++()    { i=i+1; return *this;}
          ABC  operator++(int) { ABC result(*this);i=i+1; return result;}
    friend std::ostream& operator<<(std::ostream& out, ABC const& val)
    {
        return out << val.i;
    }
};

使用此定义,您的类的行为将与整数在上述情况下的行为相同。这使得它在使用模板时非常有用,因为您现在可以使用您的类型替换整数。

注意通常我只返回一个引用(不是const引用)。

/*const*/ ABC& operator++()    { i=i+1; return *this;}
^^^^^^^^^

请参阅:https://stackoverflow.com/a/3846374/14065

但是C ++允许你做任何事情,你可以返回任何有用或具有适当意义的情况。您应该考虑对您的类有意义的内容并返回适当的值。请记住Principle of lease surprise