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