在这种情况下,我们立即返回右值:
class boVector() {};
boVector createBoVector() {
return boVector();
}
void main() {
boVector reusable = createBoVector();
}
在这种情况下,我们创建一个局部变量,然后按值返回:
class boVector() {};
boVector createBoVector() {
boVector bv;
return bv;
}
void main() {
boVector reusable = createBoVector();
}
每种情况下总份数是多少?前者是否有额外的副本?
答案 0 :(得分:2)
在这两种情况下,您都可以在createBoVector()
中创建一个局部变量。然后,在本地对象超出范围并被销毁之前,从该本地对象复制构造reusable
。
唯一的区别是,有一次你将局部变量显式(boVector bv
),有一次你没有。这里重要的是返回类型boVector
。
可能是编译器可以优化您的简单示例以避免复制,例如通过内联createBoVector()
,但你无法真正影响或依赖于此。并且,除非您的对象复制成本过高(不太可能),否则您也不应该担心它。
答案 1 :(得分:0)
每种情况下的总份数是多少?
如果您在班级中实施复制构造函数(以及复制作业运算符),您可以自行计算副本。:
int copies = 0;
class boVector()
{
public:
boVector(const boVector&) { ++copies; }
boVector& operator=(const boVector &) { ++copies; return *this; }
};
void main() {
boVector reusable = createBoVector();
cout << "copies: << copies << endl;
}