【问题标题】:When to use pointers, and when not to use them何时使用指针,何时不使用它们
【发布时间】:2010-11-22 14:41:57
【问题描述】:

我目前正在用 C++ 做我的第一个真正的项目,因此对指针来说相当新。我知道它们是什么,并且已经阅读了一些基本的使用规则。可能还不够,因为我仍然不明白什么时候使用它们,什么时候不使用它们。

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

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

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

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

【问题讨论】:

  • 一本书是绝对必要的(实际上不止一本)——你不会仅仅从 SO 答案中学习 C++。要获得的书是 Koenig & Moo 的 Accelerated C++。
  • 我在今天早些时候阅读stackoverflow.com/questions/388242/… 后预测:D

标签: c++ pointers


【解决方案1】:

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

【讨论】:

  • 这是 c++,所以你可能会使用引用而不是指针
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      来自c++ faq

      尽可能使用参考文献,并且 必要时指点。

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

      【讨论】:

        【解决方案5】:

        关于 C++ 的注意事项:

        Effective C++ and More Effective C++ by Scott Meyers。

        对于指针(和引用):

        • 如果类型适合 4 字节并且不想在调用返回后更改它,则使用按值传递。
        • 如果类型较大并且您不想在调用返回后更改它,则使用对 const 的引用传递。
        • 如果参数不能为NULL,则使用按引用传递
        • 否则使用指针。

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

        【讨论】:

        • 64bt 架构上的这 4 个字节是什么?
        • 对于第一条规则,我会说“使用 sizeof(T) > sizeof(int)....的值传递”
        • 对于较大类型的引用传递,cpp-next.com/archive/2009/08/want-speed-pass-by-value 值得一读。
        • @Evan:我的意思是4,就像所有的幻数一样,是任意的,因此很糟糕。 AFAIK,sizeof(int) 在 IA64 上也会很糟糕,因为 int 在那里是 32 位的。 (不要让我开始......)而且我记得很久以前有人在 c.l.c++.m 上提到过一个 C++ 编译器,它永远不会按值传递结构,无论多么小。总结一下我的观点:4(和sizeof(int) 可能适用于“通用 32 位架构上的通用编译器”。
        • @sbi: 关于sizeof(int) 是真的,也许sizeof(long) 是一个更好的指标,因为它在64 位系统上会更大。我的意思是不要对其进行硬编码,而是将其基于该架构/编译器的本机类型。
        【解决方案6】:

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

        不要忘记迭代器。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:
            1. 类属性:指针
            2. 方法中声明的变量:没有指针,因此我们避免了内存泄漏。

            这样可以防止内存泄漏和控制属性的一致性。

            Salu2.

            【讨论】:

              【解决方案9】:

              我的经验法则:

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

              流必须始终作为非常量引用传递。

              【讨论】:

                猜你喜欢
                • 2010-09-28
                • 1970-01-01
                • 1970-01-01
                • 2011-02-18
                • 1970-01-01
                • 2019-05-24
                • 2016-03-31
                • 1970-01-01
                • 2011-10-26
                相关资源
                最近更新 更多