【问题标题】:Why would you pass a smart pointer as a function argument in C++?为什么在 C++ 中将智能指针作为函数参数传递?
【发布时间】:2012-10-01 20:24:46
【问题描述】:

我对 C++ 智能指针非常陌生,我很难理解关于将它们用于函数参数的建议。

“C++ 编码标准:101 条规则、指南和最佳实践”说这些是传入智能指针的原因。

更喜欢通过(智能)指针传递

  • 如果参数是可选的(因此调用者可以将 null 作为“不可用”或“不关心”值传递)
  • 或者如果函数存储了指针的副本
  • 或以其他方式操纵参数的所有权。

谁能给我每个例子,为什么不使用智能指针在这种情况下会是一个坏主意?

【问题讨论】:

  • 那是什么 C++ 编码标准?
  • Sutter 有一本书,我相信 Alexandrescu 简称为“C++ 编码标准”。我认为这就是 OP 所引用的,但我似乎无法找到自己的副本来验证。这是一本非常好的书,应该适合每一个认真的 C++ 开发人员。书架。
  • @Rob : 添加书名
  • 找到我的副本。文本逐字匹配,但项目符号列表不同。 C++ 编码标准,Sutter 和 Alexandrescu,第 25 条,第 46 页。amazon.com/Coding-Standards-Rules-Guidelines-Practices/dp/…
  • @CrazyEddie 是的,它在 list of recommended books on C++ 这里。

标签: c++ function pointers smart-pointers


【解决方案1】:

更喜欢通过(智能)指针传递 [当 ...]

我认为您误读了编码标准。您将其读作“这些是使用智能指针的原因”。作者的意图是“这些是使用某种指针的原因,它可能是智能指针。”

【讨论】:

  • 您能否通过举例说明为什么指针优于引用的最后一点?
【解决方案2】:

更喜欢通过(智能)指针传递

请注意括号中的“智能”如何?

这个人在这里谈论的是通过指针与引用传递。 Smart 在括号中,因为在喜欢智能指针的团队中工作时,您会遵循类似的规则。

【讨论】:

  • 这是有道理的。你能举个例子解释一下为什么指针比引用更受欢迎的最后一点吗?
【解决方案3】:

我将假设这个问题通常与指针有关,因为这就是问题中引用的文本所解释的内容。

您想要使用智能指针(或一般来说是老式的指针)有几个原因。第一个也是最明显的一个是,当您通过引用或指针传递某些内容时,您将指针传递给内存中的项目,这意味着您将获得实际的对象,而不是通过值传递时获得的副本。当您想使用某些函数来操作对象时,这很有用,或者只是为了减少复制(想象一下一直将大文本文件作为值发送,那肯定会效率低下!)

接下来,将某些东西作为空值传递的机会。这基本上意味着参数可以作为“不存在”传入,而这又可以在逻辑中处理。例如,如果文件指针为空,则创建一个新文件。

专门针对智能指针:智能指针是在幕后进行额外管理算法的指针,这可能是引用计数或其他选项。例如,您可以使用 unique_pointer 来确保在任何给定时间只存在一个指向该对象的指针。更多信息请参见维基百科http://en.wikipedia.org/wiki/Smart_pointer

如果问题确实与一般指针的工作有关,请参阅此介绍http://www.tech-recipes.com/rx/1232/c-pointers-pass-by-value-pass-by-reference/

【讨论】:

  • 我通常倾向于相信通常有更好的方法来处理“空”条件。例如,您谈论的那个可能应该有某种代理对象,如果不是,它会简单地打开文件。客户端代码就不需要做任何检查了。
  • 虽然我同意您的补充,但问题的性质表明对编程原理的熟练程度较低,因此提出了更简单的回答。
【解决方案4】:

智能指针存在于一个,也正是一个,函数:

参数的所有权

智能指针强制执行此操作,以免您搞砸,这很可能是因为手动管理所有权极易出错,而智能指针可以保证。

在普通指针上使用智能指针没有其他理由。

【讨论】:

  • 不得不同意,我几乎写了完全相同的东西(回复:白痴)。 +1
  • 经过一番思考,我认为@Crazy Eddie 是对的。应视为; “当...时更喜欢传递指针(可能是智能指针)[而不是引用]” 对指南的引用会很好,因为它会给我们一些上下文。跨度>
  • 我相信“白痴”就是赫伯·萨特。
  • 这完全不能阻止他在撰写本文时是个白痴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2015-02-25
  • 2020-11-08
  • 2017-01-08
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多