C ++实例VS指针VS引用

时间:2012-08-10 07:19:08

标签: c++ pointers reference instance

我有一个程序可以创建我自己的Class的许多实例。然后我操作它们:读取,更改,将它们传递给某些第三方方法等。

有三个问题。

  1. 我是否存储实例向量或指针向量?为什么呢?

  2. 如果我想要更改实例,我是否将实例或指针传递给函数?为什么呢?

  3. 如果我执行想要更改实例,是否要传递指针或引用?为什么呢?

  4. 提前致谢!

    类示例:

    class Player {
        public:
            static const char               width = 35;
            static const char               height = 5;
            static const char               speed = 15;
    
            int                             socketFD;
            float                           xMin;
            float                           xMax;
    
            char                            status;
            float                           x;
            float                           y;
            char                            direction;
    
                                            Player ( int );
            void                            Reset();
            void                            Move();
            void                            SetHost();
            void                            SetClient();
    
        private:
            void                            EscapeCheck();
    };
    

6 个答案:

答案 0 :(得分:6)

  

我是否存储实例数组或指针数组?为什么呢?

如果Class是基类,并且您想要阻止对象切片,则存储指针。否则,对象。

  

如果我不想更改实例,我是否将实例或指针传递给函数?为什么呢?

如果您按值传递,则不会修改原始对象,因为您正在处理副本。如果传递指针或引用,则将其标记为const:

void foo ( MyClass const* );
void foo ( MyClass const& );
  

如果我想更改实例,我是否传递指针或引用?为什么呢?

要么。我个人更喜欢引用,指针与动态分配的联系更紧密。

如今,经常使用RAII,因此一个很好的选择是使用智能指针。

答案 1 :(得分:4)

  

我是否存储实例数组或指针数组?为什么呢?

这实际上取决于用例。根据上下文,任何一种解决方案都可以。您可能希望存储多态类型的基类,或者您可能希望避免复制元素(例如,在处理不可复制的类型时)。在这些情况下,您应该存储指针或smart pointers

  

如果我不想更改实例,我是否将实例或指针传递给函数?为什么呢?

然后你应该传递一个const引用(引用一个const实例)

void foo(const Foo& f);
  

如果我想更改实例,我是否传递指针或引用?为什么呢?

然后你应该传递一个非const引用(引用非const实例)。这假设您确实想要更改现有实例:

void foo(Foo& f);

但是什么时候你会使用指针呢?然后,我现在才能想到的情况是,当传递的实体有可能具有无效或空值时。有了参考,这是不可能的,或者至少不是微不足道的。指针可以在C ++ 11中设置为0NULL(相同)或nullptr

void (Foo* f) {
  if (f) {
    // do something with pointee
  } else {
    // deal with it
  }
}

答案 2 :(得分:3)

对于第二,它有点依赖。最有效的可能是传递一个常量引用。

通常,尽量避免使用指针。如果 使用指针,请使用smart pointers

答案 3 :(得分:2)

  

我是否存储实例数组或指针数组?为什么呢?

如果您的对象很大(即超过2-3种基本类型),您需要存储指向动态分配实例的指针数组。这将使重新排序对象和更快地重新分配/重新分配容器。如果你正在使用多态,你几乎必须使用指针(注意引用也是多态的)到基类。这将防止切片,因为数组的所有元素必须大小相同,因此如果要存储多个对象,则指向基类的指针即可。

您可能更喜欢将实例存储在容器中的情况是,如果您有一个类型(没有继承和多态)并且它不是那么大(即一些原始成员类型)。对于较大的对象,您可能希望使用链表而不是数组,以避免代价高昂的插入和重新分配。

  

如果我不想更改实例,我会传递给函数an   实例或指针?为什么呢?

将指针传递给常量对象或常量引用。除非你传递一个原语,你可以简单地传递一个廉价的副本,避免修改原始对象。 无论是指向const对象的指针还是const引用都取决于您的使用场景,引用更容易使用,就像普通实例一样,但不能像指针那样更改为引用其他对象。

  

如果我确实想要更改实例,请传递指针还是   参考?为什么呢?

如果您打算更改实例,则传递指针或引用。两者中的哪一个 - 见上文。这样您就可以直接修改特定实例。您也可以按值传递,但它会创建一个临时副本,稍后您需要将其分配回原始对象。这样做是没有意义的,如果修改是你的意图,总是去寻找指针或参考。即使您不打算修改对象,传递常量指针或引用仍然便宜得多,因为它们是int的大小,而对象可能要大得多,因此没有必要复制它。如果要传递基本类型,也可以通过值传递,但是如果您打算修改对象,则仍然可以进行一项可以避免的额外赋值。

答案 4 :(得分:1)

  1. 实例数组更好,因为您保存指针本身以及分配块标头。 (假设阵列适合您的需要)。
  2. 2,3在两种情况下,最好通过反思。在第二种情况下const ref。优点是节省了不打电话给ctors。

答案 5 :(得分:1)

  

我是否存储实例数组或指针数组?为什么呢?

我更愿意选择实例数组。你将不那么容易管理记忆。如果你动态填充指针数组,你可以在第1000个元素上捕获OOM - 现在程序必须清理半成形数组。在这种意义上,一次性预先分配一大块就更好了。

  

如果我不想更改实例,我是否将实例或指针传递给函数?为什么?   如果我想更改实例,我是否传递指针或引用?为什么呢?

我总是喜欢引用,因为那时你可以跳过检查它的有效性。维基百科says引用不能为NULL,但我可以将NULL引用四处,因为行为是未定义的,在我的编译器中它恰好就是这样。但是,如果你说明你真的处于权力的黑暗面。或者,声明接受指针的函数会邀请传递NULL,您必须始终检查它。有很好的blog描述了空引用 - 非常好的例子改变了我的想法。

使用引用的一个缺点是你不能从函数调用代码行说出函数是按值还是通过引用获取参数。

你应该记住引用本质上是指针而引用类型有大小,所以如果你的Class非常小,那么你可以考虑按值传递对象,如果你不想在函数内部改变它们。我仍然会通过引用传递 - Class可以增长然后你去修复所有原型 - 不是很好。