[英]How are objects passed to functions C++, by value or by reference?
来自C#,其中类实例通过引用传递(即,当您调用函数而不是值的副本时传递引用的副本),我想知道它在C ++中是如何工作的。 在下面的例子中,_poly = poly,是否将poly的值复制到_poly,或者是什么?
#include <vector>
using namespace std;
class polynomial {
vector<int> _poly;
public:
void Set(vector<int> poly);
};
void polynomial::Set(vector<int> poly) {
_poly = poly; <----------------
}
poly
的值将被复制到_poly
- 但您将在此过程中创建一个额外的副本。 更好的方法是通过const引用传递:
void polynomial::Set(const vector<int>& poly) {
_poly = poly;
}
编辑我在关于复制和交换的评论中提到过。 实现你想要的另一种方法是
void polynomial::Set(vector<int> poly) {
_poly.swap(poly);
}
这为您提供了强大的异常保证而非基本保证的额外好处。 在某些情况下,代码也可能更快,但我认为这更像是一个奖励。 唯一的问题是这个代码可能被称为“难以阅读”,因为必须意识到有一个隐含的副本。
这将执行整数向量的浅拷贝。 这通常会像您期望的那样工作(_poly最终将包含与poly相同的值)。
如果你有指针,你会看到一些奇怪的行为(因为它们会被值复制)。
通常,您希望通过const引用传递该参数:
void polynomial::Set( const vector<int>& poly )
在这种情况下,通过const引用传递将不会影响结果,并且将更有效,因为它将消除传递给方法的向量的不需要的副本。
这将复制整个矢量。 赋值是C ++中的值。 如果要指定指针,则指定指针值。 一旦初始化,引用可能不会被重新分配以引用另一个对象,因此它们的赋值会改变引用对象。
向量的复制运算符将复制向量的内容。
有三种可能性:
void someFunction(SomeClass theObject);
void someFunction(SomeClass *theObject);
void someFunction(SomeClass &theObject);
您的矢量将被复制。
实际上发生的是,vector的“=”运算符已经过载以进行实际复制。
是的,您指向的行是复制整个矢量。 此外,函数调用也会有一个副本,因为那不是const。
基本上,如果向量具有任何大小,这是非常昂贵的。
除非您通过引用分配或传递参数(使用&前缀),否则您将通过值传递。 对于类,这意味着使用提供的或隐式生成的(浅)复制构造函数构造对象的副本。 这可能很昂贵 - 而且通常是不合需要的。
在您的示例中,向量被复制两次 - 一次将其作为参数传递给Set()方法,并在将其分配给_poly成员时再次复制。
您可以通过引用传递向量来避免第一个副本:
void polynomial::Set(const vector<int>& poly) // passes the original parameter by reference
{
_poly = poly; // still makes a copy
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.