【问题标题】:C++: On Pointers and References, when to use them? [duplicate]C++:关于指针和引用,何时使用它们? [复制]
【发布时间】:2012-11-01 05:35:01
【问题描述】:

可能重复:
C++ Objects: When should I use pointer or reference

我刚从 Java 出来,是 C++ 的新手。在一个月的时间里,我设法自学了 C++。我在这里和那里编写了一些基本的东西,并理解了一些概念(多态性、虚函数等)。虽然我知道指针是如何工作的,但我仍然不知道何时使用它们。

我知道当你想使用 new 在堆上创建一些东西时,你必须使用指针,但我无法识别应该使用指针和引用的其他情况。关于何时使用我应该知道的指针是否有某种经验法则?比如函数参数什么时候应该有 & 或 * 等等。抱歉这个菜鸟问题。

【问题讨论】:

标签: c++ oop pointers reference


【解决方案1】:

其他 So 问题的答案相同 (http://stackoverflow.com/questions/7058339/c-when-to-use-references-vs-pointers):

尽可能使用参考,在需要的地方使用指针。

避免使用指针,直到你不能。

原因是指针使事情更难理解/阅读,比任何其他结构更不安全和更危险的操作。

所以经验法则是只有在别无选择的情况下才使用指针。

例如,当函数在某些情况下可以返回 nullptr 并且假定它会返回时,返回指向对象的指针是一个有效的选项。也就是说,更好的选择是使用类似于 boost::optional 的东西。

另一个例子是使用指向原始内存的指针进行特定的内存操作。这应该在代码的非常狭窄的部分隐藏和本地化,以帮助限制整个代码库的危险部分。

在您的示例中,使用指针作为参数是没有意义的,因为:

如果您提供 nullptr 作为参数,您将进入 undefined-behaviour-land; 参考属性版本不允许(没有容易发现的技巧)1的问题。 参考属性版本对用户来说更容易理解:您必须提供一个有效的对象,而不是可以为空的东西。 如果函数的行为必须在有或没有给定对象的情况下工作,那么使用指针作为属性建议您可以将 nullptr 作为参数传递,这对于函数来说很好。这是用户和实现代码之间的一种契约。

【讨论】:

  • 我明白了,但是当我已经在做数据结构的时候呢?比如链接列表和树?
【解决方案2】:
  • 使用引用作为函数参数(简单、高效、(大部分)安全)。

  • 将指针用作对象的非拥有成员(使用指针重新分配往往比使用引用更有意义)。

  • 使用智能指针来拥有堆分配的对象(并避免大多数对象的堆分配)。

指针也可以用在nullptr 是一个理想的指针可能值的地方,以及在你想使用指针算法的情况下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多