首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回C++对象-最佳实践

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

Stack Overflow用户
提问于 2014-04-30 09:30:41
回答 2查看 4.8K关注 1票数 6

我是C++的新手,我被困在以下问题上:

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

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

代码语言:javascript
复制
MyClass getMyClass() {
    MyClass obj;
    //work with obj, set values...
    return obj;
}

就我所理解的对象而言,您创建一个新对象,复制该对象,销毁第一个对象并返回复制的对象。所以我创建了两个对象,但我只需要一个。是那么回事吗?

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

代码语言:javascript
复制
MyClass* getMyClass() {
    MyClass* obj = new MyClass();
    //work with obj, set values...
    return obj;
}

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

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

代码语言:javascript
复制
MyClass getMyClass(MyClass& obj) {
    //work with obj, set values...
    return obj;
}

创建默认对象并设置函数中的所有值。

我还谈到了如何使用unique_ptr<MyCLass>,但也存在同样的问题,即当函数作用域被保留时,unique_ptr就会被销毁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-30 09:35:28

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2014-04-30 09:35:58

每个用例都有自己的用例,您不能说其中一个在所有环境中都比另一个好或者最坏。这一切都归结为你的对象,如何创建它们,它们应该与什么接口,它们在哪里使用。

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

例如,接受引用的对象也不需要返回对象,这是一个额外的操作。

返回指针的指针可能不需要包含头文件,一个简单的前向声明就足够了(至少当您在头文件中声明函数时是这样的)。当然,要做到这一点,您需要手动管理内存(同样:共享指针在这里可能会有所帮助)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23384459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档