繁体   English   中英

如何通过值或引用将对象传递给函数C ++?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM