我是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就会被销毁。
发布于 2014-04-30 09:35:28
解决方案1不使用复制构造函数,而是使用返回值优化。这意味着函数中构造的对象实际上不会被复制,而是直接传递给函数的调用方。解决方案1是一个非常好的选项,对于不占用堆栈空间的非多态对象(即没有继承),我将推荐该选项。
多态对象的首选方法是解决方案2,但始终要考虑由谁拥有您的对象,即谁负责调用delete。一个很好的选择是使用shared_ptr或unique_ptr。
解决方案3并不真正创建对象,只有在它已经创建之后才能使用它。在这里返回对象也是没有意义的。
发布于 2014-04-30 09:35:58
每个用例都有自己的用例,您不能说其中一个在所有环境中都比另一个好或者最坏。这一切都归结为你的对象,如何创建它们,它们应该与什么接口,它们在哪里使用。
还有第四个,通过使用共享指针shared_ptr (如果您需要共享所有权)或自动指针(unique_ptr或auto_ptr (某种程度上不推荐))返回。
例如,接受引用的对象也不需要返回对象,这是一个额外的操作。
返回指针的指针可能不需要包含头文件,一个简单的前向声明就足够了(至少当您在头文件中声明函数时是这样的)。当然,要做到这一点,您需要手动管理内存(同样:共享指针在这里可能会有所帮助)。
https://stackoverflow.com/questions/23384459
复制相似问题