1

我花了几个小时在一些优秀的 C++ 书籍以及这里关于堆栈溢出的问题上寻找讨论,虽然我看到了很多关于“堆与堆栈”问题的问题,但我正在寻找更具体的问题了解在创建类的对象成员时是否使用指针,即使用组合。

例如:

class A{
B c;
}

对比

class A{
B*c;
}

在第一个示例中,这并不是真正的“堆栈”分配,而是“静态存储区域”中的分配,这是另一回事,因此我认为堆栈与堆的讨论不适用。

我不清楚两者的优缺点。似乎我阅读的大多数代码都使用第二个选项,但为什么呢?

可能我不知道这些技术的正确术语来正确搜索该站点,否则根本没有关于此的问题。如果在其他地方确实有与此相关的答案,请务必让我知道如何找到它们,但在局部变量的上下文中,几乎所有内容似乎都更多地是关于堆栈与堆的,我想我可以处理好.

4

2 回答 2

1

人们使用第二个选项的原因是:

class A { B b;}; // error, order of classes wrong
class B { }; 

C++ 的这个简单特性使得很难用 B b 构建工作系统;风格。您必须将所有相关的类放到同一个文件中,并将这些类重新排序为完全正确的顺序。

继承也对订单有一些魔力:

class A : public B { }; // error, order of classes wrong
class B { };

所以使用继承和 B b; 一起完全固定类的顺序,大量数据成员将是噩梦。(请注意,像 float 和 int 这样的类型没有顺序问题 - 也可以为类正确执行此操作)

于 2013-02-02T09:09:16.870 回答
0

将指向对象的指针作为类的成员的另一个原因是,如果您确实需要它指向某物并且您希望指向的对象经常更改。例如,想象一个类在某些系统或框架中保留指向活动窗口的指针(完全是虚构的)。下面所指向的对象的内存activeWindow会被分配到别处,而被指向的对象本身也会经常变化。

class Monitor
{
...
Window* activeWindow
...
}

另一方面,拥有所有内容的指针并使用new运算符(或malloc()在 C 中)手动分配内存往往很慢,因为在堆上分配内存比在堆栈上分配内存要慢,并且以后还需要手动释放。所以应该尽量避免。

如果您可以取消将对象放在类的存储区域中并且不在堆上分配它,那么就这样做。

class foo
{
B c;
};

肯定比

class foo
{
public:
 foo()
 {
   this->c = new B();
 }
 ~foo()
 {
   delete this->c;
 }

private:
B* c
};

但话又说回来,这一切都取决于class B

于 2013-02-02T09:29:09.090 回答