簡體   English   中英

構造函數初始化列表 - 這會有效嗎?

[英]Constructor Initializer List - will this work?

在您的幫助下,我可以使用構造函數初始化列表解決我在此最小示例( 在其他類構造函數中使用參數化構造函數 )中描述的問題。

在我的現實生活中,事情有點困難。 我的構造函數現在看起來像這樣:

ClassC::ClassC() : _objectB(_objectA.getInt()) {
  _objectA = ClassA();
}

這會有用嗎? 編譯器不會返回任何錯誤。 但是, _objectB初始化為_objectA值,該值在下面的行中初始化。 那么_objectA.getInt()將如何返回有效值?

如果它不起作用,我怎樣才能使它工作?

如果在_objectB之前聲明了_objectA,那么將調用_objectA的默認構造函數。 並且,_objectB將使用_objectA中的getInt()值進行初始化。 之后,在構造函數的主體中,_objectA通過賦值運算符設置,使用ClassA的默認構造函數 - 這是不需要的。

如果在_objectA之前聲明_objectB,那么IDK​​ ......它可能依賴於編譯器實現。

無論哪種方式,您基本上都是初始化_objectA兩次。

如果_objectA被聲明為

class ClassC
{
    ClassA _objectA;
    ClassB _objectB;

    public:
    ClassC();
}

它將起作用,因為_objectA已經初始化(使用默認構造函數),您稍后只需將其重新分配給新類,這與_objectB初始化無關。


但是,正如@πάνταῥεῖ建議使用它更好

ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}

這將初始化_objectA ,然后將其用於_objectB初始化。

那么_objectA.getInt()將如何返回有效值?

很可能是的。 如果使用默認構造函數初始化objectA以生成有效值,則它已隱式構造(如果聲明出現在objectB之前)。

構造函數體中的賦值是多余的。

還最好寫:

 ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}

在成員初始化列表中明確說明。

類成員總是按照它們聲明的順序初始化,所以假設ClassC看起來像

class ClassC
{
    ClassA _objectA;
    ClassB _objectB;

public:
    ClassC();
//...
};

那么你的構造函數就相當於

ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {
    _objectA = ClassA();
}

如您所見, _objectA_objectB之前初始化,然后您從構造函數體中的匿名ClassA對象復制 - 賦值給_objectA

暫無
暫無

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

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