可能重复:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?
在C ++中是否有一种规则或指导,当一个人必须或至少应该选择使用引用传递而不是值时?
如果知道某个对象的对象大小(小老实说),则很难判断。
答案 0 :(得分:7)
只要您希望更改参数在函数外部可见,就应该通过引用传递。这是非const
引用的传递,主要是由逻辑而不是效率驱动。
当您处理大小大于寄存器的数据类型时,您应该通过(主要是const
)引用。由于引用主要是const
,因此您无法对其进行任何更改,因此这取决于效率。
答案 1 :(得分:3)
swap(a,b)
,例如 - 因为您实际上需要原始引用才能进行交换。)答案 2 :(得分:3)
通常情况下,我会在以下情况下使用传递参考:
1)objetc的大小比指针大:在这种情况下,如果我不想修改objetc,请使用const引用:
Reference object;
foo(object);
将foo声明为:
void foo(const Reference & object);
2)对于代码澄清,试图避免这样的事情:
int f1 = xxx;
int f2 = yyy;
int f3 = zzz;
....
foo(f1, f2, ............)
使用结构:
struct X
{
int f1;
int f2;
int f3;
....
};
X x;
x.f1 = xxx;
.....
foo(X);
将foo定义为:
foo(const X & x);
3)加速pourposes:请记住,调用函数必须将参数放在堆栈上 4)您需要修改函数内的参数。
Reference object;
foo(object);
将foo声明为:
void foo(Reference & object);
答案 3 :(得分:1)
首选pass-by-reference-to-const
至pass-by-value
。按值传递是一项昂贵的操作,因为对象的副本由复制协调器生成。此外,如果类中有一些非原始数据成员(例如:std::string
),则每次创建类的新对象时,也会创建那些std::string
个对象。
通过引用传递也可以避免slicing problem
。如果通过值将派生类对象传递给期望基类对象的函数,则派生类的派生特征将被切除,并且函数内的对象将表现为基类对象。如果您通过引用传递,则可以避免切片。
尽管如此,在某些情况下,您无法通过引用传递。如果函数参数或返回值需要具有NULL值,则不能使用引用。