我想确保我正确理解传值和传引用的区别。特别是,我正在研究对象的前缀/后缀版本的递增运算符 ++。
假设我们有以下类 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建议的那样调用前缀版本。在我看来,这比重新实现递增更符合惯用法(即使在这里实现是微不足道的)。并且摆脱那个隐式转换操作符。否则它会伤害你。(我最后一次编写隐式转换操作符是在2001年,一两年后我发现它引起了微妙的错误并将其删除 - 就像之前所有的操作符一样。BTDTGTLS。) - sbi