何时使用指针,何时不使用它们

时间:2009-08-25 12:24:16

标签: c++ pointers

我目前正在用C ++做我的第一个真正的项目,所以,对指针来说还是比较新的。我知道它们是什么,并已阅读一些基本的使用规则。可能还不够,因为我还没有真正理解何时使用它们,何时没有。

问题在于,大多数地方只提到大多数人过度使用或使用不足。我的问题是,何时使用它们,何时不使用?

目前,在许多情况下,我问自己,我应该在这里使用指针还是只将变量本身传递给函数。

例如,我知道你可以发送一个指向函数的指针,这样函数实际上可以改变变量本身而不是它的副本。但是当你只需要获取一次对象的一些信息时(例如方法需要一个getValue()的东西),指针在这种情况下有用吗?

我很乐意看到任何反应,但也有可能有用的链接。因为这是我第一次使用C ++,所以我还没有一本好的C ++书籍(如果我继续使用c ++,我会考虑买一本书)。

9 个答案:

答案 0 :(得分:19)

对于C ++的do和dont:

Scott Meyers的有效C ++和更有效的C ++。

对于指针(和引用):

  • 如果类型符合4个字节并且不希望在返回呼叫后更改它,则使用按值传递。
  • 如果类型较大并且您不希望在返回呼叫后更改它,则通过引用传递给const。
  • 如果参数不能为NULL,则使用按引用传递
  • 否则使用指针。

如果你不需要,不要使用原始指针。大多数情况下,智能指针(参见Boost)是更好的选择。

答案 1 :(得分:7)

来自c++ faq

  

尽可能使用参考,和   必要的指针。

https://isocpp.org/wiki/faq/references#refs-vs-ptrs

答案 2 :(得分:4)

1)我倾向于使用作用于该类的成员变量。它们是在类的初始化器中构造的,我不需要担心指针。

2)你可以通过引用来传递一个函数,而不用担心传递指针。这实际上会传递一个指向方法/函数的指针,该指针可以像传递类一样使用,但没有复制类本身的开销。

3)如果我需要控制一个独立于我的主应用程序架构的类的对象的生命周期......那么我将使用STL中的auto_ptr在没有人再引用它时自动处理指针的破坏。看看吧 - 这是要走的路。

答案 3 :(得分:2)

在处理已分配的内存或通过引用方法传递参数时使用它;我认为没有使用指针的规则。

答案 4 :(得分:2)

我的经验法则:

  1. 始终将函数参数作为const引用传递,
  2. 除非它们是内置类型,在这种情况下它们被复制(并且const / non-const成为样式问题,因为调用者不受影响)或
  3. 除非在函数内部进行更改,以便更改在调用者处反映,在这种情况下,它们将通过非const引用传递或
  4. 除非函数应该是可调用的,即使调用者没有要传递的对象,它们也会作为指针传递,以便调用者可以传入NULL指针(应用#1和#3来决定)是否按const T*或每T*
  5. 传递

    Streams必须始终作为非const引用传递。

答案 5 :(得分:0)

通常,当您可以使用引用而不是指针时,这是一个好主意。引用必须具有目标(没有NULL指针违例),它们在作为参数传递给函数时允许与指针相同的语义,并且它们通常更适合初学者(或那些不是来自C背景的人)。 / p>

当您想要动态分配内存时,需要指针;当你需要处理后来指定的未知数量的东西时。在这种情况下,访问内存的接口是通过newdelete来处理指针。

答案 6 :(得分:0)

我的理念是始终按值传递,除非您需要修改传递的变量或复制对象是昂贵的。在这两种情况下,首先考虑使用引用而不是指针:如果您不需要更改正在引用的对象,也不需要可能的极值(NULL指针),则可以使用引用。 / p>

不要忘记迭代器。

答案 7 :(得分:0)

以上所有好的答案。此外,如果您正在执行一些处理器密集型工作,重要的是要意识到解除引用指针很可能是处理器上的缓存未命中。使用最少的指针解引用来保持数据可访问是个好主意。

答案 8 :(得分:0)

  1. 类属性:指针
  2. 方法中声明的变量:没有指针,所以我们避免内存泄漏。
  3. 这样可以防止内存泄漏并控制属性的一致性。

    Salu2。