我对前缀运算符重载有一个疑问。
我的示例程序:
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++允许你做任何事情,你可以返回任何有用或对情况有适当意义的内容。您应该考虑什么对你的类有意义,并返回一个合适的值。记住租赁惊喜原则