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

why do we have to return const reference from unary prefix operator overloading

本文关键字:运算符 前缀 一元 重载 返回 引用 const 我们 为什么      更新时间:2023-10-16

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

我的示例程序:

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++();

提前致谢

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

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

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

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*/ ABC& operator++()    { i=i+1; return *this;}
^^^^^^^^^

参见:https://stackoverflow.com/a/3846374/14065

但是C++允许你做任何事情,你可以返回任何有用或对情况有适当意义的内容。您应该考虑什么对你的类有意义,并返回一个合适的值。记住租赁惊喜原则