返回对对象构造函数的引用

时间:2011-11-15 16:11:14

标签: c++ oop constructor reference scope

看看这段代码:

Foo &Bar::Copy()
{
    return Bar();
}

类Bar继承自Foo,而Foo是一个抽象类。但是当我打电话给Bar()并将其归还时,这样做是否安全?或者我会返回一个局部变量的地址,该变量将被Copy()函数的末尾释放?

非常感谢建议!

3 个答案:

答案 0 :(得分:1)

调用Bar();时,在对其返回引用的隐式临时对象上调用构造函数。如果您打算创建类似Clone()的函数,则典型的解决方案是使用new在堆上创建克隆。您可以使用一种智能指针来简化生命周期管理。在某些情况下,您还可以使用协变返回类型来避免类型转换:Bar &Bar::Copy()

答案 1 :(得分:1)

你没有回复ctor。 Bar(); 调用 ctor,创建一个临时对象。然后,您将返回对该临时对象的引用。

由于C ++中的ctor没有名称,因此无法在常规函数上执行许多常用操作,例如获取/返回指向函数的指针。现在还不完全清楚你在这里想要完成什么,但是如果你想返回一些会构造一个对象的东西,你通常需要定义一个调用ctor的静态成员函数,并返回一个指向该静态成员函数的指针

答案 2 :(得分:0)

这是一种未定义的行为,因为临时Bar对象将在;被销毁。

Foo Bar::Copy()
{
    return Bar();
}

更安全。但是感谢@Cat Plus Plus和@celtschk,我意识到这种方法会导致切片,丢失所有Bar特定信息。为了保持Bar对象Copy()必须返回引用或指向对象的指针。在这里,我们再次开始,因为这是UB。因此,Bar必须动态分配,其引用/指针位于Copy()函数之外。谁应该负责删除这个动态生成的Bar对象?

#include <memory>
std::shared_ptr<Foo> Bar::Copy()
{
    return std::shared_ptr(new Bar());
}

shared_ptr会自动为您执行此操作。