2012-12-19 23 views
8

可能重复:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?规则在C++中使用参考

在C++中有没有那种什么时候一个必须的规则或指导,或者至少应该选择使用通过引用比通过值?

如果是有关对象的大小,尽可能知道有些对象(小老实点)它可能变得很难判断。

+0

看到这个答案:http://stackoverflow.com/a/114351/6345(指针与参考) –

+0

同样的问题被问了这么多次在这个网站上... http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c – nogard

+0

一个比较好的规则:if(sizeof(SomeType)> sizeof(void *))//使用引用' –

回答

7

只要你想改变参数在函数外部可见,你应该通过引用传递。这是通过非const参考,主要是由逻辑,而不是效率的动机。

当您处理的数据类型的大小大于寄存器的大小时,您应该通过(主要是const)引用。由于参考文献主要是const,因此您无法对其进行任何更改,所以这是由效率驱动的。

+0

即使对于较大的对象,通过值传递通常也比参考更快,因为缺少“restrict”。 – Pubby

+0

注意:即使对于小数据类型,手工制作的拷贝构造函数的存在也会鼓励您使用'const&'。这个惯用的例子是'shared_ptr',它并不像许多人想象的那么轻量级。 –

3
  1. 如果您不想调用该对象的复制构造函数(例如,如果这样做是因为对象大小而膨胀)。
  2. 当你真正需要的参考,而不是只值(swap(a,b),例如 - 因为你实际上是在以使交换需要原始引用。)
3

通常情况下,我在使用通过引用传递以下几种情况:

1)objetc是大小比指针更大:在这种情况下,如果我不想再修改objetc,使用const引用:

Reference object; 

foo(object); 

以foo声明为:

void foo(const Reference & object); 

2)对于码澄清,试图避免这样thigs:

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)加速倾注:请记住,调用函数必须将参数4)你需要修改函数中的参数。

Reference object; 

foo(object); 

以foo声明:

void foo(Reference & object); 
1

不想pass-by-reference-to-constpass-by-value。按值传递是一项昂贵的操作,因为对象的副本是由复制构造函数生成的。另外,如果类中有一些非原始数据成员(例如:std::string),则每次创建类的新对象时,也会创建这些std::string对象。

通过引用也可以避免slicing problem。如果通过值将派生类对象传递给期望基类对象的函数,派生类的派生特征将被切掉,并且函数内部的对象将表现为基类对象。如果通过参考传递,可以避免切片。

尽管如此,有些情况下您不能通过引用传递。如果你的函数参数或返回值需要有NULL值,你不能使用引用。