返回C ++对象 - 最佳实践

时间:2014-04-30 09:30:41

标签: c++ oop

我是C ++的新手,我遇到了以下问题:

想象一下,您有一个创建新对象并返回此对象的函数。这样做的最佳方法是什么? 我找到了3种不同的解决方案。

解决方案1 ​​使用复制构造函数

MyClass getMyClass() {
    MyClass obj;
    //work with obj, set values...
    return obj;
}

据我所知,你创建一个新对象,复制该对象,销毁第一个对象并返回复制的对象。所以我创建了两个对象,但我只需要一个。是吗?

解决方案2 在堆上创建对象并使用指针

MyClass* getMyClass() {
    MyClass* obj = new MyClass();
    //work with obj, set values...
    return obj;
}

这似乎是最糟糕的解决方案,您必须自己进行内存管理。

解决方案3 将对象作为参数传递

MyClass getMyClass(MyClass& obj) {
    //work with obj, set values...
    return obj;
}

您可以创建默认对象并在函数中设置所有值。

我也非常关注使用unique_ptr<MyCLass>但是存在同样的问题,即在保留函数范围时会销毁unique_ptr

2 个答案:

答案 0 :(得分:5)

解决方案1不使用复制构造函数,而是使用return value optimization。这意味着函数中构造的对象实际上没有被复制,而是直接传递给函数的调用者。解决方案1是一个非常好的选项,我推荐用于非多态对象(即没有继承),它们不会在堆栈上占用太多空间。

多态对象的首选方法是解决方案2.但总是考虑谁拥有你的对象,即谁负责调用delete。一个很好的选择是使用shared_ptrunique_ptr

解决方案3并不真正创建对象,只有在创建对象后才能使用它。在这里返回对象也没有意义。

答案 1 :(得分:0)

其中每个都有自己的用例,你不能说其中一个比所有情况下的其他或更差。这一切都归结为你的对象,你如何创建它们,它们应该与它们接口以及它们在哪里使用。

还有第四个,通过使用共享指针shared_ptr(如果您需要共享所有权)或自动指针(unique_ptrauto_ptr(不推荐使用)返回)。

例如,参与引用的人也不需要返回该对象,这是一项额外的操作。

返回指针的人可能不需要包含头文件,简单的前向声明可能就足够了(至少在头文件中声明函数时)。但是对于这个当然你需要手动管理内存(再次:共享指针可能会有帮助)。