我花了几个小时在一些好的C ++书籍以及堆栈溢出上寻找对此的讨论,虽然我已经看到很多关于“堆与堆栈”问题的问题,但我在创建类的对象成员时,更具体地了解是否使用指针,即使用组合。
例如:
class A{
B c;
}
VS
class A{
B*c;
}
在第一个例子中,这不是真正的“堆栈”分配,而是“静态存储区域”中的分配,这是另一回事,因此我认为堆栈与堆的讨论不适用。 / p>
我不清楚的是两者的优点和缺点。似乎我读过的大多数代码都使用第二个选项,但为什么呢?
有可能我不知道这些技术的正确术语来正确搜索这个网站,或者根本就没有问题。如果在其他地方确实存在与此相关的答案,请务必让我知道如何找到它们,但几乎所有内容似乎都更多地是关于堆栈与堆在局部变量的上下文中,并且我认为我有一个处理就可以了
答案 0 :(得分: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这样的类型没有顺序问题 - 并且也可以为类正确地执行它)
答案 1 :(得分:0)
将对象指针作为类的成员的另一个原因是,如果您确实需要指向某个对象并且希望指向的对象经常更改。例如,想象一个类在某个系统或框架中保持指向活动窗口的指针(完全是虚构的)。下面activeWindow
指向的对象的内存将被分配到别处,并且指向的对象本身将经常更改。
class Monitor
{
...
Window* activeWindow
...
}
另一方面,指向所有内容并使用new
运算符(或C中的malloc()
)手动分配内存往往会很慢,因为在堆上分配内存比内存上的内存慢堆叠并且还需要稍后手动释放。所以如果可能的话应该避免。
如果您可以取消将对象放在类的存储区域中而不将其分配到堆上,那么就这样做。
class foo
{
B c;
};
肯定比
更好class foo
{
public:
foo()
{
this->c = new B();
}
~foo()
{
delete this->c;
}
private:
B* c
};
但是,这又取决于class B