我对前缀运算符重载有一个疑问。
我的示例程序:
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++();
提前致谢
答案 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