[英]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.