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

如何在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;看起来不太好。我不想返回复制的值,因为它效率很低(我认为),下面是问题

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


慕容3067478
浏览 527回答 3
3回答

翻过高山走不出你

我不想返回复制的值,因为它效率低下证明给我看。查找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;}这将对事物调用复制构造函数,因此您可能希望自己实现该构造函数。就像这样:Thing(const Thing& aThing) {}这可能执行得稍微慢一点,但可能根本不是问题。更新编译器可能会优化对复制构造函数的调用,因此不会有额外的开销。(就像评论中指出的那样)。
打开App,查看更多内容
随时随地看视频慕课网APP