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

dev*_*ium 5 c++

来自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;                             <----------------
}
Run Code Online (Sandbox Code Playgroud)

rlb*_*ond 13

poly的价值将被复制到_poly- 但你将在这个过程中制作一个额外的副本.更好的方法是通过const引用传递:

void polynomial::Set(const vector<int>& poly) {
    _poly = poly;                      
}
Run Code Online (Sandbox Code Playgroud)

编辑我在关于复制和交换的评论中提到过.实现你想要的另一种方法是

void polynomial::Set(vector<int> poly) { 
    _poly.swap(poly); 
}
Run Code Online (Sandbox Code Playgroud)

这为您提供了强大的异常保证而非基本保证的额外好处.在某些情况下,代码也可能更快,但我认为这更像是一个奖励.唯一的问题是这个代码可能被称为"难以阅读",因为必须意识到有一个隐含的副本.

  • @gs:但为什么要依靠呢?最好明确记下一个人的电话语义.并且,在调试模式下,不会避免虚假副本. (3认同)