C++ 后缀增量运算符
我有一个自定义类MyInt,它封装了一个int m\u值数据。后缀运算符C++ 后缀增量运算符,c++,visual-c++,C++,Visual C++,我有一个自定义类MyInt,它封装了一个int m\u值数据。后缀运算符 MyInt operator++(int) { MyInt temp(*this); ++(*this); return temp; } 如果运算符返回一个对象,那么为什么我不能多次调用postfix++运算符,如下所示: MyInt value(10); value++; // valid value++++; // Why is this invalid?? Cant it be i
MyInt operator++(int)
{
MyInt temp(*this);
++(*this);
return temp;
}
如果运算符返回一个对象,那么为什么我不能多次调用postfix++运算符,如下所示:
MyInt value(10);
value++; // valid
value++++; // Why is this invalid?? Cant it be interpreted as (value++)++
为什么value+++给出了一个错误levalue required
如果我可以调用MyInt类中定义的value.print()方法,那么我也应该能够执行value++?错误答案: 因为
value++
是一个临时变量,它保存value
的旧值。你不能++
它
你也不能写15++
!这是相似的。前者是一个临时变量,后者是一个常量,所有变量都不能递增
更正:既然这个答案被接受了,我就不打算更改原来的帖子,但是因为人们会阅读它,我会在这里发布更正
首先,我不是说常量和临时对象是同一个概念。我只是想说临时对象不是l值,就像常量不是一样,没有实际使用l值这个词
关于值+++
,这不是一个错误。我刚刚用我的g++4.5测试了它,效果很好。在其他答案中,您可以阅读:
根据2003年标准第3.10.10节:
为了修改对象,对象的左值是必需的,但类类型的右值在某些情况下也可用于修改其引用。[示例:为对象(9.3)调用的成员函数可以修改该对象。]
你所做的事情本质上是错误的:
假设
value
保持10
。第一个value++
将value
更改为11
,但返回一个包含10
的临时对象。然后,您将++
它将临时值(您从未访问)更改为11
,但再次返回包含10
的临时对象。因此value++++
的行为与value++
完全相同,只是它做了一些不必要的工作。错误答案:
因为value++
是一个临时变量,它保存value
的旧值。你不能++
它
你也不能写15++
!这是相似的。前者是一个临时变量,后者是一个常量,所有变量都不能递增
更正:既然这个答案被接受了,我就不打算更改原来的帖子,但是因为人们会阅读它,我会在这里发布更正
首先,我不是说常量和临时对象是同一个概念。我只是想说临时对象不是l值,就像常量不是一样,没有实际使用l值这个词
关于值+++
,这不是一个错误。我刚刚用我的g++4.5测试了它,效果很好。在其他答案中,您可以阅读:
根据2003年标准第3.10.10节:
为了修改对象,对象的左值是必需的,但类类型的右值在某些情况下也可用于修改其引用。[示例:为对象(9.3)调用的成员函数可以修改该对象。]
你所做的事情本质上是错误的:
假设value
保持10
。第一个value++
将value
更改为11
,但返回一个包含10
的临时对象。然后,您将++
它将临时值(您从未访问)更改为11
,但再次返回包含10
的临时对象。因此value++++
的行为与value++
完全相同,只是它做了一些不必要的工作。实际上,这:
#包括
结构MyInt{
MyInt():值(0){}
MyInt&运算符++(){
实际上,这是:
#包括
结构MyInt{
MyInt():值(0){}
MyInt&运算符++(){
std::cout Withint x
,x++
也会返回一个int
;)@delnan是的,我也尝试过。但是由于我可以对返回值调用方法,我想我可以像使用方法一样再次使用a++了。后缀运算符的不同之处在于,我可以对返回值调用方法,但我不能使用更多的后缀+han once?我想真正的问题是为什么后缀增量需要一个左值…@KerrekSB是的,这个问题也可以这样解释。为什么post和pre的行为不同?这看起来像是一个编译器错误。你使用的是什么版本?对于int x
,x++
也会返回一个int
;)@delnan是的,我试过t这也是。但由于我可以对返回值调用方法,我想我可以像使用方法一样再次使用a++了。是什么让后缀运算符不同,我可以对返回值调用方法,但我不能多次使用后缀+?我想真正的问题是为什么后缀增量需要左值…@KerrekSB是的问题c也可以这样解释。为什么post和pre的行为不同?这看起来像是一个编译器错误。你使用的是什么版本?我在想象一个世界,人们会写value++++++++++++++。恐怖!是的,因为当你写++value
时,你会更改变量value
本身,并返回对它的引用。然后,它就变了它不是一个临时变量。如果不返回引用,+++value
也是不可能的。这实际上是不正确的。你可以在右值上调用成员函数。gcc 4.3.4。@Kdansky可能是简写符号,或者实用运算符对你来说很可怕。你可能使用它们很糟糕,或者你的美感很差e、 但对许多人来说,这是一种美。这不是正确的答案。你当然可以++
用户定义类型的临时表。15++
类似,但只有synt
#include <iostream>
struct MyInt {
MyInt() : value(0) {}
MyInt& operator++() {
std::cout << "Inside MyInt::operator++()" << std::endl;
++value;
return *this;
}
MyInt operator++(int)
{
MyInt temp(*this);
++(*this);
return temp;
}
int value;
};
int main() {
MyInt mi;
std::cout << "Value before: " << mi.value << std::endl;
mi++++;
std::cout << "Value after: " << mi.value << std::endl;
}