如何在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; ,这看起来不太好。 我不想返回复制的值,因为效率不高(我认为),所以在这里提出问题

  • 是否有第三种解决方案(不需要复制该值)?
  • 如果我坚持第一种解决方案,是否有任何问题?
  • 何时以及为什么我应该使用第二种解决方案?

  • 我不想返回复制的值,因为效率不高

    证明给我看。

    查找RVO和NRVO,以及C ++ 0x移动语义。 在大多数情况下,在C ++ 03中,out参数只是让你的代码变得丑陋的一种好方法,而在C ++ 0x中,你实际上会使用out参数伤害自己。

    只需编写干净的代码,按价值返回。 如果性能是一个问题,请将其归档(不要猜测),并找到可以解决的方法。 它可能不会从函数中返回。


    也就是说,如果你死定了这样的写作,你可能会想要做出out参数。 它避免了动态内存分配,这是更安全和通常更快。 它确实需要你在调用函数之前有一些方法来构造对象,这对于所有对象并不总是有意义的。

    如果你想使用动态分配,至少可以做到的是把它放在一个智能指针。 (无论如何都应该始终这样做)然后你不必担心删除任何东西,事情是异常安全的等等。唯一的问题是它可能比按值返回更慢!


    只需创建对象并将其返回

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

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


    只需返回一个像这样的对象:

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

    这将调用Things上的拷贝构造函数,所以你可能想要自己实现它。 喜欢这个:

    Thing(const Thing& aThing) {}
    

    这可能会慢一点,但它可能不是问题。

    更新

    编译器可能会优化对拷贝构造函数的调用,所以不会有额外的开销。 (就像评论中指出的dreamlax一样)。

    链接地址: http://www.djcxy.com/p/72973.html

    上一篇: How to "return an object" in C++?

    下一篇: What is the correct way of using C++11's range