8

可能重复:
如何将对象传递给 C++ 中的函数?
为什么要通过 const 引用而不是按值传递?

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

而且,据所知(老实说,很少),如果与某个对象的大小差不多,则可能会变得难以判断。

4

4 回答 4

7

每当您希望对参数的更改在函数外部可见时,都应该通过引用传递。这是非const参考传递,主要是出于逻辑而非效率的动机。

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

于 2012-12-19T07:54:34.177 回答
3
  1. 如果您不想调用对象的复制构造函数(例如,如果这样做由于对象大小而膨胀)。
  2. 当您实际需要引用时,而不仅仅是值(swap(a,b)例如 - 因为您实际上需要原始引用才能进行交换。)
于 2012-12-19T07:54:50.717 回答
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)为了加速purposes:记住调用函数必须把参数放在堆栈上 4)你需要修改函数内部的参数。

Reference object;

foo(object);

将 foo 声明为:

void foo(Reference & object);
于 2012-12-19T08:00:36.363 回答
1

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

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

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

于 2012-12-19T08:15:23.270 回答