簡體   English   中英

指針與類的非指針成員

[英]pointer vs non-pointer members of a class

我的問題是,假設我們有兩個A和B類。我想在A類中有一個B的對象。

我應該用,

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

要么

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

據我所知,在第一個場景中,我可以使用new運算符初始化對象*b ,對於第二個場景,如果我不想使用class B的默認構造函數,我可以使用初始化列表初始化b 哪個更方便使用?

這取決於。

即使您使用指針,也可以初始化初始化列表中的成員,但這不是您最關心的問題。

兩者都有優點和缺點:

使用指針:

優點:

  • 這個類的內存會更小

  • 你只需要向另一個類的前向聲明 - 不需要在標題中包含其他標題

  • 可以使用B派生對象作為成員

缺點:

  • 內存管理 - 這是一個非常大的問題。 您是否希望由類管理內存(覆蓋析構函數,賦值運算符和復制構造函數)?

使用對象:

優點:

  • 無需擔心內存管理

缺點:

  • 只能使用基類的對象。 如果你想從B派生怎么辦?

  • 每個實例的內存更多

  • B構造函數將在構造A被調用

  • 你需要在標題內完整定義B

如果我想到更多,我會編輯我的答案。

在這種情況下,非指針版本更方便。 您無需擔心在正確的時間調用delete ,因此您無需擔心析構函數,復制構造函數和復制賦值運算符。

通常,您應該盡可能避免動態分配的內存。

第二個更方便,因為您不需要自己管理內存。 沒有new ,沒有delete

如果你選擇第一個,那么你可能還需要實現三元規則(在C ++ 03中):

或者,五條規則(在C ++ 11中):

這條規則背后的基本思想如下:

因此,除非您有充分理由需要指針版本(例如在需要多態行為的情況下),否則必須采用第二種方法(非指針方法)。

使用第二種,盡量避免在C ++中盡可能多地使用new ,除非你使用RAII。

如果你想要A中的B類對象,那么你必須使用第二個。 第一個沒有在A中給你一個B*類型的對象,它在A中給你一個B*類型的對象。

第二個對於幾乎所有目的來說也更方便。 只在必要時才使用指針,即使使用智能指針而不是B*資源處理也更方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM