Cam*_*Cam 21 c++ increment return-by-reference
我想确保我理解按值传递和正确传递.特别是,我正在查看++
对象的增量运算符的前缀/后缀版本.
我们假设我们有以下课程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现在是别名吗?
fre*_*low 20
在后缀增量中调用对象本身的前缀增量更为惯用:
X operator++(int)
{
X copy(*this);
++*this; // call the prefix increment
return copy;
}
Run Code Online (Sandbox Code Playgroud)
因此,递增X
对象的逻辑仅包含在前缀版本内.
Shi*_*rik 17
这是一个正确的实现.通常情况下,后缀运算符的性能会更差,因为您必须在执行增量之前创建另一个副本(这就是为什么我习惯于始终使用前缀,除非我需要其他东西).
通过引用返回,您将返回对当前对象的l值引用.编译器通常会通过返回当前对象的地址来实现它.这意味着返回对象就像返回一个数字一样简单.
但是,按值返回,必须完成复制.这意味着在返回期间(而不仅仅是地址)复制更多信息以及要调用的复制构造函数.这就是您的性能受到影响的地方.
您的实施效率与典型实施相当.
编辑:关于你的附录,不,它们不是别名.您已创建两个单独的对象.按值返回时(以及从后缀增量运算符中创建新对象时),此新对象将放置在不同的内存位置.
但是,在以下代码中,a和b 是别名:
int a = 0;
int& b = ++a;
Run Code Online (Sandbox Code Playgroud)
b是引用a的地址.