在剛接觸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...