为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C+中“返回一个对象”?

如何在C+中“返回一个对象”?

C++
慕容3067478 2019-07-02 16:48:49
如何在C+中“返回一个对象”?我知道标题听起来很熟悉,因为有很多类似的问题,但是我要求问题的另一个方面(我知道堆栈上的东西和堆中的东西之间的区别)。在Java中,我总是可以返回对“本地”对象的引用public Thing calculateThing() {     Thing thing = new Thing();     // do calculations and modify thing     return thing;}在C+中,为了做类似的事情,我有两个选项(1)每当需要“返回”对象时,我都可以使用引用void calculateThing(Thing& thing) {     // do calculations and modify thing}然后像这样使用它Thing thing;calculateThing(thing);(2)或者我可以返回指向动态分配对象的指针Thing* calculateThing() {     Thing* thing(new Thing());     // do calculations and modify thing     return thing;}然后像这样使用它Thing* thing = calculateThing();delete thing;使用第一种方法,我不必手动释放内存,但对我来说,这会使代码难以阅读。第二种方法的问题是,我必须记住delete thing;看起来不太好。我不想返回复制的值,因为它效率很低(我认为),下面是问题是否有第三种解决方案(不需要复制值)?如果我坚持第一个解决方案,有什么问题吗?何时以及为什么要使用第二个解决方案?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我不想返回复制的值,因为它效率低下

证明给我看。

查找RVO和NRVO,并在C+0x移动-语义。在大多数情况下,在C+03中,OUT参数只是使代码变得丑陋的好方法,而在C+0x中,使用OUT参数实际上会对自己造成伤害。

只需编写干净的代码,按值返回即可。如果性能是一个问题,分析它(停止猜测),并找到您可以做什么来修复它。它可能不会从函数中返回东西。


这就是说,如果你已经下定决心要这样写了,你可能会想要执行OUT参数。它避免了动态内存分配,这是更安全和一般更快。它确实要求您在调用函数之前有一些方法来构造对象,这并不总是对所有对象都有意义。

如果您想要使用动态分配,可以做的最起码的是把它放在一个智能指针中。(无论如何,这应该一直在做)然后你不用担心删除任何东西,事情是异常安全的,等等。唯一的问题是,它可能比返回值慢无论如何!


查看完整回答
反对 回复 2019-07-02
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

只需创建对象并返回

Thing calculateThing() {
    Thing thing;
    // do calculations and modify thing
     return thing;}

我认为,如果您忘记了优化,只需编写可读的代码(稍后需要运行分析器-但不要预先优化),您会帮自己一个忙。


查看完整回答
反对 回复 2019-07-02
?
当年话下

TA贡献1890条经验 获得超9个赞

只需返回这样的对象:

Thing calculateThing() {
   Thing thing();
   // do calculations and modify thing
   return thing;}

这将对事物调用复制构造函数,因此您可能希望自己实现该构造函数。就像这样:

Thing(const Thing& aThing) {}

这可能执行得稍微慢一点,但可能根本不是问题。

更新

编译器可能会优化对复制构造函数的调用,因此不会有额外的开销。(就像评论中指出的那样)。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 526 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信