什麼時候需要初始化列表?

2021-10-10 21:07:03 字數 1860 閱讀 3994

在剛接觸qt的時候我們都會看到自動生成的主介面建構函式如下:

mainwidget::mainwidget(qwidget *parent) :

qwidget(parent),

ui(new ui::mainwidget)

這邊使用的就是初始化列表,初始化列表主要用於以下幾種情況:

第一種:

類b中包含另乙個類a的物件a,但是類a的建構函式含有引數例如a(int x),那麼當類b初始化時,若沒有初始化列表,無法正常初始化b,正確做法是將b的建構函式寫為b():a(x)。

**如下:

#include "iostream"

using namespace std;

class a;};

class b

;private:

a a;

};int _tmain(int argc, _tchar* ar**)

執行效果:

a create

b create

如果將初始化列表a(1)刪去,編譯將出錯。

第二種:

當類成員中含有const修飾的變數時,在宣告時就需要初始化,在建構函式中只能進行賦值,並不是在初始化階段,因此這種情況必須要用到初始化列表來初始化,示例**如下:

#include "iostream"

using namespace std;

class a

};int _tmain(int argc, _tchar* ar**)

執行效果:

a create

如果將初始化列表a(1)刪去,編譯將出錯,提示常量a沒有初始化。

第三種:

當類成員中含有引用(&)的變數時,在宣告時就需要初始化,在建構函式中只能進行賦值,並不是在初始化階段,因此這種情況必須要用到初始化列表來初始化,示例**如下:

using namespace std;

class b

};int _tmain(int argc, _tchar* ar**)

執行效果:

b create

如果將初始化列表b(b)刪去,編譯將出錯,提示建構函式未提供&b的初始化設定。

第四種:

當類為繼承類,且想要初始化父類成員時,需要使用初始化列表,示例**如下:

using namespace std;

class a;

a(int x) :int_x(x) ;

void printx()

int int_x;

};class b :public a;

};int _tmain(int argc, _tchar* ar**)

執行效果:

creat a

creat b

1如果將b的建構函式初始化列表寫為錯誤1,那麼編譯不通過,初始化衝突,到底是父類初始化還是子類初始化?

如果將父類a的建構函式顯式呼叫即錯誤2,並且b建構函式不使用初始化列表,那麼列印出的int_x將是隨機值。原因在於在b執行建構函式的時候,已經隱式的呼叫a的無參建構函式,此時int_x已經被初始化,此時再次顯示呼叫a的有參建構函式已經無法再次初始化int_x,因此並沒有被賦值,所以此時列印出來的是隨機值。

第五種:

需要提公升編譯效率的情況,初始化列表可以使得變數在初始化階段的同時進行賦值,而不使用初始化列表的情況則需要進行初始化和賦值兩個階段,這對於大型類來說效率有很大的提公升。

另外,需要注意的是,初始化列表並不是變數初始化順序的依據,初始化順序依然是以宣告的順序為準。

類什麼時候被初始化

1.建立乙個類的例項,也就是說new乙個物件的時候 2.訪問某個類或者介面的中的靜態變數,或者對靜態變數賦值的時候 3.呼叫類的靜態方法 4.反射 class.forname com.ysd.entity 5.初始化乙個類的子類 首先會先初始化它的父類 6.jvm啟動時標明的啟動類,就是檔名和類名相...

什麼時候需要建索引,什麼時候不需要?

什麼時候要索引?1 表的主鍵 外來鍵必須有索引 2 資料量超過300必須有索引 3 經常與其他表進行連線的表,在連線欄位上建立索引 4 經常出現在where子句的字段,特別是大表字段,必須建索引 5 索引應建立在小字段上,對於大文字字段甚至超長字段,不要建索引 什麼時候不需要索引?1 建立組合索引,...

C 為什麼需要成員初始化列表

將建構函式分為兩個階段的執行過程 初始化階段和建構函式函式體階段。既然稱它為成員初始化列表,那麼該階段在初始化階段完成。那麼類成員變數不外乎類型別和非類型別。而對於非類型別而言,此時 無論是在初始化表中還是函式體內完成賦值效果是一致的,即並未初始化。表現的有點不同的是類型別 test1 includ...