在 C++ 中使用引用的规则 [重复]
Posted
技术标签:
【中文标题】在 C++ 中使用引用的规则 [重复]【英文标题】:Rules for Using References in C++ [duplicate] 【发布时间】:2012-12-06 12:47:15 【问题描述】:可能重复:How to pass objects to functions in C++?Why pass by const reference instead of by value?
在 C++ 中是否有一种规则或指导来说明何时必须或至少应该选择使用按引用传递而不是按值传递?
据了解,如果与某个对象的大小差不多(老实说),就很难判断了。
【问题讨论】:
查看这个答案:***.com/a/114351/6345(指针与参考) 同一个问题在这个网站上被问了很多次...***.com/questions/2139224/… 一个有点好的规则:if(sizeof(SomeType) > sizeof(void*)) // Use references
如果是“难以判断”,也无所谓。当它很重要时,你会注意到。
【参考方案1】:
只要您希望对参数的更改在函数外部可见,就应该通过引用传递。这是通过非const
引用传递的,主要是出于逻辑而非效率。
当您处理大小大于寄存器大小的数据类型时,您应该通过(主要是const
)引用。由于引用主要是const
,所以不能对其进行任何更改,所以这是出于效率的考虑。
【讨论】:
由于缺少restrict
,即使对于较大的对象,按值传递通常也比引用更快。
注意:即使是小数据类型,手工复制构造函数的存在应该鼓励您使用const&
。惯用的例子是shared_ptr
,它不像很多人想象的那么轻量级。【参考方案2】:
-
如果您不想调用对象的复制构造函数(例如,如果这样做会因对象大小而膨胀)。
当您实际需要引用时,而不仅仅是值(例如,
swap(a,b)
- 因为您实际上需要原始引用才能进行交换。)
【讨论】:
【参考方案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) 用于加速处理:记住调用函数必须将参数放入堆栈 4) 函数内部需要修改参数。
Reference object;
foo(object);
将 foo 声明为:
void foo(Reference & object);
【讨论】:
【参考方案4】:首选pass-by-reference-to-const
而不是pass-by-value
。按值传递是一项昂贵的操作,因为对象的副本是由复制构造函数生成的。另外,如果类中有一些非原始数据成员(例如:std::string
),则每次创建该类的新对象时,也会创建那些std::string
对象。
通过引用传递也避免了slicing problem
。如果将派生类对象按值传递给期望基类对象的函数,则派生类的派生特征将被切掉,函数内部的对象将表现为基类对象。如果通过引用传递,可以避免切片。
尽管如此,在某些情况下您不能通过引用传递。如果您的函数参数或返回值需要具有 NULL 值,则不能使用引用。
【讨论】:
以上是关于在 C++ 中使用引用的规则 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如果使用引用的目的是更改原始变量的值,为啥要使用 const 引用传递? [C++] [重复]