簡體   English   中英

初始化非指針類成員

[英]Initializing Non-pointer Class Members

最近,我一直在閱讀來自廣受歡迎的C ++ FAQ的構造函數。 其中一個條目提到最好使用初始化列表,而不是在構造函數本身的代碼塊中初始化類成員。

這是因為編譯器傾向於創建類成員的多個副本,而不是簡單地創建一個副本。

Foo::Foo( void )
    : mBar( new Bar ) //pointer to some memory address
{
}

Foo::Foo( void )
{
    mBar = new Bar;
}

它還指出了一件事(並且,雖然這與構造函數有關,但它也與通常非成員函數的對象的純初始化有關)是在通過如下方法初始化對象時:

void f( void )
{
    Foo foo( Bar() ); //Bad.

    foo.x(); //error
}

你會,我引用: "[declare] a non-member function that returns a Foo object"

(有關詳細信息,請單擊上面的鏈接)

問題

因此,擁有以下內容是不明智的:

Geometry::Geometry( void )
    : mFaces( QVector< GLushort >() ),
      mFinalized( false ),
      mNormals( QVector< QVector3D >() ),
      mVerticies( QVector< QVector3D >() )

甚至這個:

Geometry::Geometry( void )
    : mFaces( QVector< GLushort > ),
      mFinalized( false ),
      mNormals( QVector< QVector3D > ),
      mVerticies( QVector< QVector3D > )

由於這些被分配的方式(即,這些是非指針的事實),它讓我想知道這些對象是否在開始時甚至是NEED初始化。 如果他們這樣做,這是正確的方法嗎? 或者,有更好的初始化方法嗎?

這與問題有何關系

這與一般性問題有關,因為C ++構造函數初始化背后的方法與使用構造函數初始化對象的方式有關,以及我不知道對象是否在堆棧上分配 - 或者,我相信無論如何- (無論哪種方式,沒有指針分配的對象)甚至需要首先進行初始化。

如果成員變量是具有用戶聲明的默認構造函數的類類型,則無需在初始化列表中明確提及它:在構造期間,在輸入構造函數的主體之前,將始終調用其默認構造函數。

如果成員變量是基本類型(如intbool )或者是沒有任何用戶聲明的構造函數的類類型,則需要顯式初始化它,否則它將不會被初始化(並且它將具有未知值;您無法讀取未初始化的對象)。

暫無
暫無

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

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