C ++返回对象的引用

时间:2015-09-20 23:11:10

标签: c++ return-by-reference

我目前正在参加C ++课程并且正在努力学习参考文献。我知道有一些类似的话题,但我无法找到答案。 事情是我的教授希望我们在返回对象时使用引用,因此返回值或使用指针作为返回是没有选项。 所以我想我必须使用一个动态分配的对象(返回对本地对象的引用以一团糟结束......对吗?)

1. Complex& method() {
2. Complex *object = new Complex();
3. return *object; }

这是我挣扎的地方,我如何抓住回报呢?

1. Complex one = object.method();

据我所知,有了这个,我只会得到一个复制和内存泄漏 那么如何用指针捕捉它呢?

1. Complex *two = new Complex();
2. delete two;
3. *two = object.method(); 

这似乎有效,但有一种方法可以只用一行吗?或者它应该做得与众不同吗?

3 个答案:

答案 0 :(得分:1)

一个想法是将返回的对象存储在对象中:

class Obj {
public:
  Complex &method() { c.data = 10; return c; }
private:
  Complex c;
};

这样就不会返回本地变量或堆分配。

答案 1 :(得分:1)

返回类成员时,

返回引用是有效的,

像:

class A{
  Complex member;
public:
  Complex& method(){
    return member;
  }
};

您还可以返回引用以返回一些不能为NULL的静态或全局对象,如:

Complex& method() {
     static Complex c; // c cant be null
     return c;
}

使用引用的优点是您可以将函数调用用作对象,例如:cin>>method().real>>method().img;并使用相同的对象,即使您多次调用该方法也是如此。  但是你的代码没有使用引用,因为每次调用都会创建一个新实例。

如果使用动态分配,则应返回指针:

Complex* method() {
   return new Complex();
}

你应该记得删除它。

答案 2 :(得分:0)

  

我的教授希望我们在返回对象时使用引用

当我读到这篇文章时,我的第一个想法就是你的教授意味着:

void method(Complex& nonConstPassByReference) 
{
    nonConstPassByReference.data = 10;
}

int method(Complex& nonConstPassByReference) 
{
    nonConstPassByReference.data = 10;
    return (0);  // no error occurred
}

当我使用这种技术时,我现在使用

std::string method(Complex& nonConstPassByReference) 
{
    std::stringstream ss;
    nonConstPassByReference.data = 10;
    // more stuff
    if (anErrorOccurred) 
       ss << errorDescriptionInfo << std::endl;
    return (ss.str());  // no error occurred when return size is 0
}

这是因为一般来说,所有方法或函数都可以有两种形式参数。我们将它们称为按值传递,并通过引用传递。

通常,所有函数/方法都可以同时具有输入和输出形式参数。通常,输入参数是按值传递的。输出参数是非const-pass-by-reference,邀请方法体将其结果发送回调用代码的预构建实例。

偶尔,传递引用变量用于“输入到方法”参数(可能用于性能 - 以避免昂贵的副本)。在这种情况下,input-to-method-pass-by-reference参数应标记为'const',如果代码试图修改该输入,则要求编译器生成错误。

请注意,许多C函数不会返回一个值,该值是操作的一部分... return是一个'error occurred'指示,错误描述隐藏在errno中。