通过引用传递 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。就个人而言,当对象不是可选的时,我使用引用,否则使用指针。这也是我公司使用的惯例。 +1at 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. 通过指针传递——优点? [复制]的主要内容,如果未能解决你的问题,请参考以下文章