2009-08-25 71 views
8

我目前正在C++中完成我的第一个真正的项目,所以对于指针来说是相当新的。我知道他们是什么,并阅读了一些基本的使用规则。可能还不够,因为我还没有真正理解何时使用它们,以及何时不使用它们。什么时候使用指针,何时不使用它们

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

目前,在许多情况下,我问自己,我应该在这里使用一个指针,或者只是将变量本身传递给该函数。例如,我知道你可以发送一个指向函数的指针,这样函数实际上可以改变变量本身,而不是它的副本。但是当你只需要获取一些对象的信息(例如该方法需要一个getValue())时,指针在这种情况下是否有用?

我很想看到任何反应,但也可能是有用的链接。由于这是我第一次使用C++,我还没有一本好的C++书(如果我继续使用我可能会用到的C++,就会考虑购买一本书)。

+6

一本书是绝对必要的(不止一个是,实际上) - 你不会从单独的SO答案中学习C++。这本书是由Koenig&Moo提供的Accelerated C++。 – 2009-08-25 12:34:50

+0

我在阅读http:// stackoverflow之后预测到了。com/questions/388242/the-definitive-c-book-guide-and-list这一天早些时候:D – bastijn 2009-08-25 16:00:51

回答

18

对于做的和不要的的C++:

C++有效和更有效的C++斯科特迈尔斯。

对于指针(和引用):

  • 使用按值传递,如果该类型适合4个字节,不希望拥有它调用的返回后改变。
  • 如果类型较大,并且您不希望在呼叫返回后更改它,请使用传入引用来传递const。
  • 如果参数不能为NULL,则使用通过引用的方式
  • 否则使用指针。

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

+0

64bt体系结构上的那些4字节是什么? – sbi 2009-08-25 14:08:04

+0

对于第一条规则,我会说“使用sizeof(T)> sizeof(int)...的值传递” – 2009-08-25 14:26:37

+0

至于较大类型的传递引用,http:// cpp-next。 com/archive/2009/08/want-speed-pass-by-value /值得一读。 – jalf 2009-08-25 15:34:23

2

无论何时处理分配的内存或通过引用方法传递参数,都可以使用它;我不认为有没有不使用指针的规则。

+0

这是C++,所以你可以使用一个引用优先于指针可能 – frankster 2009-08-25 12:52:03

4

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

2)您可以通过引用传递函数,而不用担心传递指针。这将有效地传递一个指向方法/函数的指针,就像你传递类一样,但没有复制类本身的开销。如果我需要控制独立于主应用程序体系结构类的对象的生命周期......那么我将使用STL中的auto_ptr自动处理指针的销毁,当没有人再引用它时。检查一下 - 这是要走的路。

0

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

当您要执行内存的动态分配时,指针是必需的;当你需要处理将在后面指定的未知数量的事物时。在这种情况下,访问存储器的接口是通过newdelete来处理指针。

7

c++ faq

使用引用的时候就可以了, 指针时,你必须。

​​

0

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

不要忘记迭代器。

0

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

0
  1. 类属性:指针
  2. 变量的方法声明:没有指针,所以我们避免内存泄漏。

以这种方式防止内存泄漏和控制属性的一致性。

Salu2。

1

我的经验法则:

  1. 总是传递函数的参数作为常数引用,
  2. ,除非它们被内置类型,在这种情况下它们被复制(和const /非const成为问题作为来电者的风格不受影响)或
  3. 除非他们的目的是改变功能内部,以便更改反映在来电者,在这种情况下,他们通过非const引用或
  4. 除非函数应该是可调用的,即使调用者没有ob JECT通过,那么他们作为指针传递,使呼叫者可以在NULL指针票代替。(适用#1和#3,以决定是否每const T*或每T*通过)

流必须总是传来传作为非const引用。

相关问题