可能重复:
C++ 对象:我什么时候应该使用指针或引用
我刚从 Java 出来,是 C++ 的新手。在一个月的时间里,我设法自学了 C++。我在这里和那里编写了一些基本的东西,并理解了一些概念(多态性、虚函数等)。虽然我知道指针是如何工作的,但我仍然不知道何时使用它们。
我知道当你想使用 new 在堆上创建一些东西时,你必须使用指针,但我无法识别应该使用指针和引用的其他情况。关于何时使用我应该知道的指针是否有某种经验法则?比如函数参数什么时候应该有 & 或 * 等等。抱歉这个菜鸟问题。
可能重复:
C++ 对象:我什么时候应该使用指针或引用
我刚从 Java 出来,是 C++ 的新手。在一个月的时间里,我设法自学了 C++。我在这里和那里编写了一些基本的东西,并理解了一些概念(多态性、虚函数等)。虽然我知道指针是如何工作的,但我仍然不知道何时使用它们。
我知道当你想使用 new 在堆上创建一些东西时,你必须使用指针,但我无法识别应该使用指针和引用的其他情况。关于何时使用我应该知道的指针是否有某种经验法则?比如函数参数什么时候应该有 & 或 * 等等。抱歉这个菜鸟问题。
其他问题的答案相同(http://stackoverflow.com/questions/7058339/c-when-to-use-references-vs-pointers):
尽可能使用参考,必须使用指针。
避免指针,直到你不能。
原因是与任何其他构造相比,指针使事情更难理解/阅读,更不安全且更危险的操作。
所以经验法则是只有在没有其他选择的情况下才使用指针。
例如,当函数在某些情况下可以返回 nullptr 并且假定它会返回时,返回指向对象的指针是一个有效的选项。也就是说,更好的选择是使用类似于 boost::optional 的东西。
另一个例子是使用指向原始内存的指针进行特定的内存操作。这应该隐藏在非常狭窄的代码部分中,以帮助限制整个代码库的危险部分。
在您的示例中,使用指针作为参数没有意义,因为:
如果您提供 nullptr 作为参数,您将进入 undefined-behaviour-land;参考属性版本不允许(没有容易发现的技巧)1的问题。参考属性版本对用户来说更容易理解:您必须提供一个有效的对象,而不是可以为空的东西。如果函数的行为必须在有或没有给定对象的情况下工作,那么使用指针作为属性建议您可以将 nullptr 作为参数传递,这对于函数来说很好。这是用户和实现代码之间的一种契约。
使用引用作为函数参数(简单、高效、(大部分)安全)。
使用指针作为对象的非拥有成员(使用指针重新分配往往比使用引用更有意义)。
使用智能指针来拥有堆分配的对象(并避免大多数对象的堆分配)。
指针也可以用于指针nullptr
的理想可能值以及想要使用指针算术的情况。