![](/img/trans.png)
[英]Why does postfix operator++ have higher precedence than prefix operator++?
[英]implementing prefix operator++
从http://www.learncpp.com/cpp-tutorial/97-overloading-the-increment-and-decrement-operators/
类声明
class Digit
{
private:
int m_nDigit;
public:
Digit(int nDigit=0)
{
m_nDigit = nDigit;
}
Digit& operator++();
Digit& operator--();
int GetDigit() const { return m_nDigit; }
};
他们对operator++
实现
Digit& Digit::operator++()
{
// If our number is already at 9, wrap around to 0
if (m_nDigit == 9)
m_nDigit = 0;
// otherwise just increment to next number
else
++m_nDigit;
return *this;
}
我的operator++
替代实现
Digit& Digit::operator++()
{
return Digit(m_nDigit == 9 ? 0 : (m_nDigit + 1));
}
我想知道
当然,创建对象有一些缺点:
它不会编译。 将非常量引用绑定到临时对象是不可能的。
即使它编译它不会执行正确的操作(你的版本,使operator++
设置m_nDigit
到9
,其他的版本递增m_nDigit
,当周围包裹10
到达)。
即使它确实编译并做了正确的事情,也将是非常不安全的。 返回的引用将绑定到一个临时对象,该对象将在函数返回之前被销毁,这意味着任何尝试访问operator++
返回值所引用的对象都将导致未定义的行为。
要在这两种实现之间进行选择,您应该选择一种可以编译,正确且安全的实现。
您对三元运算符有疑问。 另外,您将返回对象的副本,而不是对象本身,并且,如果您试图使运算符重载以像内置类型一样工作,则应始终返回对该对象的引用。
我认为您应该这样做:
Digit& Digit::operator++()
{
m_nDigit = (m_nDigit == 9 ? 0 : m_nDigit++);
return *this;
}
或像这样:
Digit& Digit::operator++()
{
m_nDigit = (++m_nDigit % 10);
return *this;
}
创建新对象的不利之处在于代码:
Digit d;
++d;
我希望d的值能够更改,而对于新对象则不会。 在很多情况下都使用此运算符(不将其分配给变量),因此,如果不增加并返回相同的对象,就不能那样使用它。
在您的替代实现中,您有2个问题:
代替m_nDigit = 9
做m_nDigit == 9
。 当前, m_nDigit
始终为9,返回值始终为0。
您应该更改m_nDigit
的值。 返回0时-您不这样做。
return语句有问题,因为期望运算符更改操作数的值,而不是创建新的对象。
编辑
为了澄清问题,请考虑以下代码:
Digit x;
x++;
您希望x
作为此代码的结果是什么? 我希望它是1。使用您的运算符,它将保持不变。
m_nDigit = 9
是一个赋值,它将始终被评估为true
。 m_nDigit = (m_nDigit + 1) % 9;
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.