1、類成員為const類型
2、類成員為引用類型
#include <iostream> using namespace std; class A { public: A(int &v) : i(v), p(v), j(v) {} void print_val() { cout << "hello:" << i << " " << j << endl; } private: const int i;//類成員為const類型 int p; int &j;//類成員為引用類型 }; int main(int argc, char **argv) { int pp = 45; A b(pp); b.print_val(); }
運行結果:
究其因
const對象或引用只能初始化但是不能賦值。構造函數的函數體內只能賦值而不是初始化,因此初始化const對象或引用的唯一機會是構造函數函數體之前的初始化列表中。
從無到有叫初始化,初始化(調用拷貝構造函數)創建了新對象;賦值(調用賦值操作符)沒有創建新對象,而是對已有的對象賦值。
3、類成員為沒有默認構造函數的類類型
1 #include <iostream> 2 using namespace std; 3 4 class Base 5 { 6 public: 7 Base(int a) : val(a) {} 8 private: 9 int val; 10 }; 11 12 class A 13 { 14 public: 15 A(int v) : p(v), b(v) {} 16 void print_val() { cout << "hello:" << p << endl; } 17 private: 18 int p; 19 Base b;//類成員為沒有默認構造函數的類 20 }; 21 22 int main(int argc, char **argv) 23 { 24 int pp = 45; 25 A b(pp); 26 b.print_val(); 27 }
運行結果:
原因同樣是創建對象時,要初始類成員的每一個成員
4、如果類存在繼承關系,派生類必須在其初始化列表中調用基類的構造函數
1 #include <iostream> 2 using namespace std; 3 4 class Base 5 { 6 public: 7 Base(int a) : val(a) {} 8 private: 9 int val; 10 }; 11 12 class A : public Base 13 { 14 public: 15 A(int v) : p(v), Base(v) {}//類A繼承自類Base,需在其初始化列表中調用Base的構造函數 16 void print_val() { cout << "hello:" << p << endl; } 17 private: 18 int p; 19 }; 20 21 int main(int argc, char **argv) 22 { 23 int pp = 45; 24 A b(pp); 25 b.print_val(); 26 }
運行結果:
以上。