根据这个:Operator overloading,
class X {
X& operator++()
{
// do actual increment
return *this;
}
X operator++(int)
{
X tmp(*this);
operator++();
return tmp;
}
};
是实现++
运算符的方法。第二个(后缀运算符)按值返回,而不是按引用返回。这很清楚,因为我们无法返回对本地对象的引用。因此,我们不是在堆栈上创建tmp
对象,而是在堆上创建它并返回对它的引用。所以我们可以避免额外的副本。所以我的问题是,以下是否有任何问题:
class X {
X& operator++()
{
// do actual increment
return *this;
}
X& operator++(int)
{
X* tmp = new X(*this);
operator++();
return *tmp;
}
};
答案 0 :(得分:4)
调用者现在必须处理删除内存。
答案 1 :(得分:1)
如果您的目的是避免额外的副本,请记住可能没有额外的副本。 RVO会避免它 - 返回值将直接放入调用者的变量X中,从而优化副本。
答案 2 :(得分:1)
因此,我们不是在堆栈上创建tmp对象,而是在堆上创建它 并返回对它的引用。所以我们可以避免额外的副本。
根据RVO,大多数情况下没有额外的副本。 x
内的值operator++
直接向上移动为返回值。检查一下:
#include <iostream>
class X
{
public:
X() {}
X( const X & x ) {
std::cout << "copy" << std::endl;
}
X& operator++()
{
// do actual increment
return *this;
}
X& operator++(int)
{
X x;
operator++();
return x;
}
};
int main()
{
X x;
x++;
return 0;
}
没有副本(仅通过vc7测试)。但是,您的实现会在此行中进行复制:
X tmp(*this);
或在此:
X* tmp = new X(*this);