4

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

有三个问题。

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

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

  3. 如果我确实想更改一个实例,我是传递一个指针还是一个引用?为什么?

提前致谢!

类示例:

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();
};
4

6 回答 6

6

我是存储实例数组还是指针数组?为什么?

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

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

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

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

如果我确实想更改一个实例,我是传递一个指针还是一个引用?为什么?

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

如今,经常使用 RAII,因此一个很好的替代方法是使用智能指针。

于 2012-08-10T07:23:42.850 回答
4

我是存储实例数组还是指针数组?为什么?

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

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

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

void foo(const Foo& f);

如果我确实想更改一个实例,我是传递一个指针还是一个引用?为什么?

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

void foo(Foo& f);

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

void (Foo* f) {
  if (f) {
    // do something with pointee
  } else {
    // deal with it
  }
}
于 2012-08-10T07:23:52.893 回答
3

对于第二个,这取决于。最有效的可能是传递一个常量引用。

通常,尽量避免使用指针。如果必须使用指针,请使用智能指针

于 2012-08-10T07:24:01.817 回答
3

我是存储实例数组还是指针数组?为什么?

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

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

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

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

如果我确实想更改一个实例,我是传递一个指针还是一个引用?为什么?

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

于 2012-08-10T08:02:02.310 回答
1
  1. 实例数组更好,因为您节省了指针本身以及分配块标头。(前提是该数组可以满足您的需求)。

2,3 在这两种情况下,最好通过引用。在第二种情况下,const ref。优点是节省了不调用ctors。

于 2012-08-10T07:23:05.153 回答
1

我是存储实例数组还是指针数组?为什么?

我更喜欢使用实例数组。您将不再那么头疼管理内存。如果您动态填充指针数组,您可能会在第 1000 个元素处捕获 OOM - 现在程序必须清理半格式数组。从这个意义上说,最好一次性预先分配一大块。

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

我总是更喜欢参考,因为这样你就可以跳过检查它的有效性。Wikipedia引用不能为 NULL,但我可以到处使用 NULL 引用,因为行为是未定义的,而在我的编译器中恰好是这样。但是,如果您考虑到这一点,那么您确实处于权力的阴暗面。或者,声明函数接受指针邀请传递NULL,您必须始终检查它。有一个很好的博客描述了空引用——很好的例子改变了我的想法。

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

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

于 2012-08-10T07:52:20.483 回答