1、當類的成員是常變數時,即用const來回修飾的類的成員;
2、類的成員是引用;
3、需要初始化的資料成員是
物件的情況(這裡包含了繼承情況下,通過顯示呼叫父類的建構函式對父類資料成員進行初始化);
資料成員是物件,並且這個物件只有含引數的建構函式,沒有無引數的建構函式;
如果我們有乙個類成員,它本身是乙個類或者是乙個結構,而且這個成員它只有乙個帶引數的建構函式,而沒有預設建構函式,這時要對這個類成員進行初始化,就必須呼叫這個類成員的帶引數的建構函式,如果沒有初始化列表,那麼他將無法完成第一步,就會報錯。
4.、如果類存在繼承關係,派生類必須在其初始化列表中呼叫基類的建構函式。即子類初始化父類的私有成員。
基於前兩種情況的原因:
類物件的構造順序是這樣的:
1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員;
2.進入建構函式後在建構函式中執行一般賦值與計算。而對於const成員或者引用,必須在呼叫建構函式進入函式體之前就的得完成初始化。如果直接在定義時就賦值,那麼類的所有物件的這個成員的值就是一樣了,就失去了變數的意義。
#include#includeusing namespace std;
class a
void print_val()
private:
const int i;//這裡也可以直接完成初始化,const int i=100,不報錯,但是去變數意義
int p;
int &j=p;
};
int main(int argc, char **argv)
3、對第三的解釋
#include using namespace std;
class test1
// 無參建構函式
test1(const test1& t1) // 拷貝建構函式
test1& operator = (const test1& t1) // 過載賦值運算子(也稱為過載賦值函式)
private:
int a ;
};
class test2
};
輸出為:
construct test1
end of fist construct t1
copy constructor for test1
第一行輸出對應 呼叫**的第一行
第三行輸出對應test2的初始化列表,直接呼叫拷貝建構函式初始化test1,省去了呼叫預設建構函式的過程。
所以乙個好的原則是,能使用初始化列表的時候盡量使用初始化列表。
4、對第四的解釋
#include using namespace std;class base
private:
int val;
}; class a : public base
void print_val()
private:
int p;
}; int main(int argc ,char **argv)
什麼情況下會初始化類
都什麼情況下會初始化類 public class a static public void run public void service public class b extends a public static void main string args 答案 static block a s...
c 必須在類初始化列表中初始化的幾種情況
1.類成員為const型別 2.類成員為引用型別 include using namespace std class a void print val private const inti const intp int j 引用 int main int argc char argv 究其因 con...
c 必須在類初始化列表中初始化的幾種情況
1.類成員為const型別 2.類成員為引用型別 include using namespace std class a void print val private const int i int p int j int main int argc char argv 究其因 const物件或引用...