可能重复:
未定义的行为和序列点
重载后缀运算符时,我无法理解操作的顺序。让我们看看下面的两个小例子:
int i = 0;
std::cout << std::endl << "i: " << i;
i = ++i;
std::cout << std::endl << "i: " << i;
i = i++;
std::cout << std::endl << "i: " << i;
MyClass myObject;
std::cout << std::endl << "myObject: " << myObject.getMyValue();
myObject = ++myObject;
std::cout << std::endl << "myObject: " << myObject.getMyValue();
myObject = myObject++;
std::cout << std::endl << "myObject: " << myObject.getMyValue();
出现了两种截然不同的行为。输出如下:
i: 0
i: 1
i: 2
myObject: 0
myObject: 1
myObject: 1
不同的行为,你看。这是我的重载运算符方法的概要。
MyClass & MyClass::operator++ ()
{
++myValue;
return *this;
}
MyClass MyClass::operator++ (int postfixFlag)
{
MyClass myTemp(*this);
++myValue;
return myTemp;
}
好吧。前缀是有道理的。您可以增加所需的任何内容,然后返回相同的对象,现在已修改,以防分配。但是后缀是让我绊倒的地方。它应该分配,然后递增。在这里,我们是自我分配的。所以使用内置的整数类型,这是有道理的。我将i
' 的值分配给自身,然后i
递增。很公平。但是,假设MyClass
是对 int 的重新创建。它从 0 开始,前缀递增,然后变为 1。然后是关键行。 myObject = myObject++
. 这和myObject = myObject.operator++(int postfixFlag)
. 它被调用。 myTemp
用值 1 初始化。它递增到 2。然后我们返回 temp。如果我们要分配给另一个对象,那就行得通。但在这里我是自分配的,所以在增加到 2 之后,myObject
设置为等于返回的用初始值初始化的临时对象,我们又回到了 1!那讲得通。但这是一种根本不同的行为。
我该如何解决它?int 是如何做到的?这个方法一般是怎么写的?您对与此相关的 C++ 行为和设计有什么意见吗?等等我现在有点困惑,因为书籍和在线示例似乎总是使用上述方法的变体。
感谢您的阅读,任何输入将不胜感激!