注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案的索引,它们是最有意义的顺序:
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
#include <stdio.h>
int main(void)
{
int i = 0;
i = i++ + ++i;
printf("%d\n", i); // 3
i = 1;
i = (i++);
printf("%d\n", i); // 2 Should be 1, no ?
volatile int u = 0;
u = u++ + ++u;
printf("%d\n", u); // 1
u = 1;
u = (u++);
printf("%d\n", u); // 2 Should also be one, no ?
register int v = 0;
v = v++ + ++v;
printf("%d\n", v); // 3 (Should be the …Run Code Online (Sandbox Code Playgroud) c increment operator-precedence undefined-behavior sequence-points
我想确保我理解按值传递和正确传递.特别是,我正在查看++对象的增量运算符的前缀/后缀版本.
我们假设我们有以下课程X:
class X{
private:
int i;
public:
X(){i=0;}
X& operator ++ (){ ++i; return *this; } //prefix increment
X operator ++ (int unused){ //postfix increment
X ret(*this);
i++;
return ret;
}
operator int(){ return i; } //int cast
};
Run Code Online (Sandbox Code Playgroud)
首先,我是否正确实现了前缀/后缀增量运算符?
第二,与前缀运算符相比,后缀运算符的内存效率如何?具体来说,X当使用每个版本的运算符时,会创建多少个对象副本?
准确地解释通过引用返回和按值返回会发生什么可能有助于我理解.
编辑:例如,使用以下代码...
X a;
X b=a++;
Run Code Online (Sandbox Code Playgroud)
... a和b现在是别名吗?
看看这些功能签名:
class Number {
public:
Number& operator++ (); // prefix ++
Number operator++ (int); // postfix ++
};
Run Code Online (Sandbox Code Playgroud)
前缀不带任何参数,但后缀确实如此.为什么?我认为我们可以用不同的返回类型识别它们.
c++ language-design operator-overloading prefix postfix-operator
我可以用吗:
MyClass& MyClass::operator++ () {
a++; // private var of MyClass
return (*this);
}
Run Code Online (Sandbox Code Playgroud)
或者它可以是:
MyClass MyClass::operator++ ();
Run Code Online (Sandbox Code Playgroud)
有什么不同?
谢谢你的回答.我有另一个问题.
很多人都这样做:
MyClass& MyClass::operator++();
MyClass MyClass::operator++(int);
Run Code Online (Sandbox Code Playgroud)
这不合逻辑吗?如果可以,请举一些例子.
我知道第一个版本是预增量,第二个版本是后增量,但我问为什么第一个版本返回引用而第二个版本没有?它在相同的代码(类)中,并且使用相同的代码.
我看到这个C++代码是一个更大的例子的一部分:
Date &Date::operator++()
{
helpIncrement();
return *this;
}
Date Date::operator++( int )
{
Date temp = *this;
helpIncrement();
return temp;
}
Run Code Online (Sandbox Code Playgroud)
首先,如果Date temp = *this,那么我不明白为什么这两个函数的返回类型是不同的?一个返回*this,另一个返回temp,分配给*this?
其次,为什么第二个函数的参数没有变量名?