在C ++中使用引用的规则

时间:2012-12-19 07:52:02

标签: c++

  

可能重复:
  How to pass objects to functions in C++?
  Why pass by const reference instead of by value?

在C ++中是否有一种规则或指导,当一个人必须或至少应该选择使用引用传递而不是值时?

如果知道某个对象的对象大小(小老实说),则很难判断。

4 个答案:

答案 0 :(得分:7)

只要您希望更改参数在函数外部可见,就应该通过引用传递。这是非const引用的传递,主要是由逻辑而不是效率驱动。

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

答案 1 :(得分:3)

  1. 如果您不想调用对象的复制构造函数(例如,如果由于对象大小而这样做是扩展的)。
  2. 当您确实需要引用时,而不仅仅是值(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-constpass-by-value。按值传递是一项昂贵的操作,因为对象的副本由复制协调器生成。此外,如果类中有一些非原始数据成员(例如:std::string),则每次创建类的新对象时,也会创建那些std::string个对象。

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

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