为什么我们必须从一元前缀运算符重载返回 const 引用
why do we have to return const reference from unary prefix operator overloading
我对前缀运算符重载有一个疑问。
我的示例程序:
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++允许你做任何事情,你可以返回任何有用或对情况有适当意义的内容。您应该考虑什么对你的类有意义,并返回一个合适的值。记住租赁惊喜原则
相关文章:
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 迭代器类的重载前缀增量运算符会引发分段错误
- 如何在自定义对象的<<运算符中添加自定义前缀
- C++编译器如何扩展前缀和后缀运算符++()?
- 指向重载前缀和后缀运算符中的类对象的指针
- C++如何知道在重载运算符时增量++是前缀或后缀
- 重复使用前缀 ++ 运算符时的未定义行为
- 带有线程的运算符++(前缀)
- 重载运算符<<C++中带前缀
- 前缀和后缀运算符 C++
- 编译器如何翻译后缀/前缀运算符
- C++ 加法 (+) 的前缀和后修复运算符重载(不是 ++ 或 --)
- GCC 前缀增量运算符在将值传递给函数时行为异常
- 涡轮增压C++(非可视)(后缀和前缀运算符)
- 前缀运算符的实现
- 如何计算前缀和后缀运算符的组合
- 前缀和后缀运算符的奇怪行为
- 为什么我们必须从一元前缀运算符重载返回 const 引用
- C++前缀增量运算符返回左值这一事实的实际用法
- C++后缀/前缀运算符重载作为非成员函数