指针与类的非指针成员

时间:2011-12-21 12:19:39

标签: c++ class

我的问题是,假设我们有两个A和B类。我希望在A类中有一个B的对象。

我应该使用吗,

class A
{
  public:
          A();
          ~A();
          B* b;
};

class A
{
      public:
              A();
              ~A();
              B b;
};

据我所知,在第一个场景中,我可以使用*b运算符初始化对象new,对于第二个场景,我可以使用初始化列表初始化b我不想使用class B的默认构造函数。哪个更方便使用?

5 个答案:

答案 0 :(得分:9)

这取决于。

即使您使用指针,也可以初始化初始化列表中的成员,但这不是您最关心的问题。

两者都有优点和缺点:

使用指针:

优点:

  • 课程内存会更小

  • 你只需要向另一个类提出前向声明 - 不需要在标题中包含其他标题

  • 可以使用B中的派生对象作为成员

缺点:

  • 内存管理 - 这是一个非常大的内容。您是否希望由类管理内存(覆盖析构函数,赋值运算符和复制构造函数)?

使用对象:

优点:

  • 无需担心内存管理

缺点:

  • 只能使用基类的对象。如果您想从B

  • 派生,该怎么办?
  • 每个实例的内存更多

  • 构建B

  • 时将调用A的构造函数
  • 您需要在标题

  • 中找到B的完整定义

如果我想到更多,我会编辑我的答案。

答案 1 :(得分:6)

在这种情况下,非指针版本更方便。您无需担心在正确的时间调用delete,因此您无需担心析构函数,复制构造函数和复制赋值运算符。

通常,应尽可能避免动态分配内存。

答案 2 :(得分:5)

第二个更方便,因为您不需要自己管理内存。没有new,没有delete

如果你选择第一个,那么你可能还必须实现三法则(在C ++ 03中):

或者,五法则(在C ++ 11中):

此规则背后的基本理念如下:

因此,除非您有充分的理由说明为什么需要指针版本(例如在您需要多态行为时),您必须采用第二种方法(非指针式方法)。

答案 3 :(得分:2)

使用秒,尽量避免在C ++中尽可能使用new,除非您使用RAII。

答案 4 :(得分:1)

如果你想在A中使用B类的对象,那么你必须使用第二个。第一个没有在A中给出B类型的对象,它在A中为您提供了类型为B*的对象。

第二种对于几乎所有目的来说也更方便。只在必要时使用指针,即使使用智能指针而不是B*,资源处理也更方便。