我目前正在参加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();
这似乎有效,但有一种方法可以只用一行吗?或者它应该做得与众不同吗?
答案 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中。