在c ++中返回一个对象(或结构)

时间:2010-09-30 15:08:19

标签: c++ struct

嘿,我对下一个代码中的内容有疑问:

 typedef struct {
      double re,im;
 } Complex;

 Complex ComplexCreate(double r=0.,doublei=0.)
 {
      Complex c;
      c.re=r;
      c.im=i;
      return c; // problem with this line 
      // my question is : is c getting duplicated and returning or does it return nothing
      // when i we go back to the main
 }

我知道在c ++中,我可以而且应该使用类,这只是我想要测试的东西。 在此先感谢您的帮助

5 个答案:

答案 0 :(得分:5)

如果未启用优化,则会生成并返回c的副本。如果命名返回值优化(NRVO)可用,则编译器可以忽略该副本。

除此之外,为什么带有构造函数的类并不复杂:

class Complex
{
public: 
    Complex( double r = 0.0, double i = 0.0 ) 
       : re( r ) 
       , im( i )
    {}

    double re;
    double im; 
};

然后,如果您仍然需要像Complex ComplexCreate这样的函数(double r = 0.,doublei = 0。),它将如下所示:

Complex ComplexCreate( double r= 0.0, double i = 0.0 )
{
    return Complex( r, i );
}

这里返回一个未命名的临时变量意味着没有命名返回值优化(NRVO)的编译器将有更好的机会来删除本地对象的副本 - 而是直接在调用者堆栈上工作。

答案 1 :(得分:4)

它将返回Complex个对象,但由于NRVO,它可能无法复制。

答案 2 :(得分:3)

C将会重复,你会得到它。你可以自己检查一下:

#include <iostream>


typedef struct T {
double a;
int b;
} T;


T f() {
    T newT = {10.0,5};
    std::cout << "Temporary address : " << &newT << std::endl;
    return newT;
}

int main(int argc,char* argv[]) {
    T retT = f();
    std::cout << "Final address : " << &retT << std::endl;
}

通常会产生不同的地址,如:

Temporary address : 0x7fff97d92660
Final address : 0x7fff97d926c0

答案 3 :(得分:2)

答案 4 :(得分:0)

另外

Stephen C.Dewhurst“C ++ Gotchas。避免编码和设计中的问题”

得了58。