我是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
。
答案 0 :(得分:5)
解决方案1不使用复制构造函数,而是使用return value optimization。这意味着函数中构造的对象实际上没有被复制,而是直接传递给函数的调用者。解决方案1是一个非常好的选项,我推荐用于非多态对象(即没有继承),它们不会在堆栈上占用太多空间。
多态对象的首选方法是解决方案2.但总是考虑谁拥有你的对象,即谁负责调用delete
。一个很好的选择是使用shared_ptr
或unique_ptr
。
解决方案3并不真正创建对象,只有在创建对象后才能使用它。在这里返回对象也没有意义。
答案 1 :(得分:0)
其中每个都有自己的用例,你不能说其中一个比所有情况下的其他或更差。这一切都归结为你的对象,你如何创建它们,它们应该与它们接口以及它们在哪里使用。
还有第四个,通过使用共享指针shared_ptr
(如果您需要共享所有权)或自动指针(unique_ptr
或auto_ptr
(不推荐使用)返回)。
例如,参与引用的人也不需要返回该对象,这是一项额外的操作。
返回指针的人可能不需要包含头文件,简单的前向声明可能就足够了(至少在头文件中声明函数时)。但是对于这个当然你需要手动管理内存(再次:共享指针可能会有帮助)。