通过引用传递 v. 通过指针传递——优点? [复制]

Posted

技术标签:

【中文标题】通过引用传递 v. 通过指针传递——优点? [复制]【英文标题】:Pass by Reference v. Pass by Pointer -- Merits? [duplicate] 【发布时间】:2011-04-07 00:19:07 【问题描述】:

可能的重复:When pass-by-pointer is preferred to pass-by-reference in C++?Are there benefits of passing by pointer over passing by reference in C++?How to pass objects to functions in C++?

大家好, 作为我的化学工程研究生研究的一部分,我正在开发一个大型的面向对象的 c++ 应用程序框架。

我发现我的许多函数都采用指向自定义对象或 STL 对象的指针。我发现在编写代码方面,这使得访问存储在其中的函数或变量变得更加困难。

但是,除了简单之外,通过引用传递与通过指针传递有什么优点/缺点吗?

如果其中一个比另一个有优势,我可能会考虑重构我的代码以统一使用任何最佳方法。如果没有,我仍然可以重构以始终使用通过引用传递以提高可读性(即不必取消引用)

再次,我想做出最好的决定,因为我的框架已经有 40 多个文件了,所以我想尽可能早地实现尽可能统一的结构,并使用任何最佳方法。

提前致谢!

【问题讨论】:

更难?输入 -> 而不是 .? 这是另一种问“我知道它已经被问过很多次了。但是让我再问一遍,也许你不会注意到这是一个骗子。”真的:) 请参阅“相关”链接。很多相同的问题。 BTW 根据 c++ gist,尖括号越多,代码越好。所以我建议不要强化按值或按引用。但是在boost::call_traits<ParameterType>::param_type。玩得开心 @Beta ... 和 var pass 上的 "(&..." ... ;o) ...至于这是一个骗局,我深表歉意。我应该通过删除关闭这个话题吗?我查看了前几个链接,但它们听起来不像是在问我的问题。 【参考方案1】:

主要区别在于引用不能为 NULL(至少在没有恶意编程的情况下不能)。对于语法糖和需要参数时,我会通过引用传递。如果我遇到参数是可选的情况,我会通过指针传递。

总是有例外。如果符合现在的风格,或者因为我有事要做,把它当成指针可能会更方便。

【讨论】:

+1。就个人而言,当对象不是可选的时,我使用引用,否则使用指针。这也是我公司使用的惯例。 +1 at least not without some malicious programming【参考方案2】:

更喜欢通过引用传递。如果没有别的原因,我这样做是因为引用根本不能是NULL。它结束了这么多愚蠢的错误、辩论、合同检查、内存责任问题等......

【讨论】:

当然引用可以为NULL。以int& f(int* p) return *p; 和电话int* x = NULL; int& y = f(x); 为例。我无法计算以多种形式看到此错误的次数。但从语义上讲,我同意。如果您想“谈论某事”而不是“说出您正在谈论的事情的位置”,请使用参考。【参考方案3】:

仅供参考,今天早些时候有人以略微不同的方式提出了这个问题:

When to pass by reference and when to pass by pointer in C++?

规范建议是“通过 ref 传递给 const,除非有充分理由选择另一个选择”。

【讨论】:

【参考方案4】:

如果您的选择是指针与引用,请使用引用。它们具有指针的所有优点,而没有取消引用未初始化指针的危险。

不要太担心尽早实施统一的方法——在这种情况下,即使代码库很大,在两者之间来回切换(一次一个函数)也并不困难。

【讨论】:

如果引用是通过取消引用未初始化的指针来构造的,您仍然可以取消引用未初始化的指针。【参考方案5】:

我个人喜欢通过指针传递,因为它在我的代码中提供了某种程度的一致性。我自动知道我的对象 Foo 是一个指针。这同样适用于参考,所以一定要选择一个并坚持下去。

【讨论】:

【参考方案6】:

虽然我喜欢引用,但在一些常见情况下您不能使用它们:

您希望将对象引用/指针存储在成员变量中,但不想在类构造函数中要求该对象 您希望将对象引用/指针存储在成员变量中并在运行时更改实例 您想让方法或函数的对象参数成为可选的

在我看来,混合使用引用和指针是很丑陋的,所以我更喜欢指针。

【讨论】:

以上是关于通过引用传递 v. 通过指针传递——优点? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

引用调用 vs 复制调用调用

按引用传递或按值传递指针容器之间的区别

通过指针或引用将映射传递给函数?

有人可以解释在 C++ 中通过指针传递和通过引用传递的目的是啥吗?

C++ 通过引用传递向量字符指针

使用通过引用传递的参数(通过指针)优化 OpenCL 函数中的指针访问