【发布时间】:2011-03-12 00:09:44
【问题描述】:
我想确保我正确理解按值传递与按引用传递。特别是,我正在查看对象的增量 ++ 运算符的前缀/后缀版本。
假设我们有以下类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
};
首先,我是否正确实现了前缀/后缀增量运算符?
其次,与前缀运算符相比,后缀运算符的内存效率如何?具体每个版本算子使用时会创建多少个X对象副本?
对按引用返回与按值返回究竟发生了什么的解释可能有助于我理解。
编辑:例如,使用以下代码...
X a;
X b=a++;
...a 和 b 现在是别名了吗?
【问题讨论】:
-
不需要在后缀运算符中后缀递增
i。事实上,我会使用 FredOverflow suggests 并调用前缀版本。 IMO 确实比重新实现增量更惯用(即使这里的实现很简单)。 并摆脱那个隐式转换运算符。否则它会伤害你。 (我第三次也是最后一次编写隐式转换运算符是在 2001 年,一两年后我发现它会导致一些细微的错误并将其删除 - 就像之前的所有错误一样。BTTDGTLS。)
标签: c++ increment return-by-reference