◎Default initialization (默認初始化)
發生時機 :
◎list initialization
發生時機 :
direct list initialization
◎vaule initialization
發生時機 :
◎zero initialization
發生時機 :
發生時機 :
- 變量不提供initializer時,依據變量類型及位置,進行Default initialization。
- 內置類型(int、float、double...)且為靜態變量與全域變量 default-initialization為 0。
- bool 的 default-initialization 為false。
- 若非內置類型(int、float、double...)且為靜態變量與全域變量,則為不確定值。
- 若為class類型,則會調用你所設定(或者隱藏的)的默認建構函式。
class Demo { private: int * IntPtr; int length; public: // 建構函式 Demo() { cout << "default constructor" << endl; length = 1; IntPtr = new int[length]; for (int i = 0; i < length; i++) { IntPtr[i] = 0; } } // 建構函式 Demo(int len) : length(len) { cout << "overloaded constructor" << endl; IntPtr = new int[length]; } // 複製建構函式 Demo(const Demo & demo) : length(demo.length) { IntPtr = new int[demo.length]; for (int i = 0; i < demo.length; i++) { IntPtr[i] = demo.IntPtr[i]; } cout << "copy constructor" << endl; } // 重載 = 運算子 Demo& operator=(const Demo &demo) { if (this != &demo) { length = demo.length; // 刪除原有動態資源 delete[] IntPtr; IntPtr = new int[demo.length]; for (int i = 0; i < demo.length; i++) { IntPtr[i] = demo.IntPtr[i]; } } return *this; } // 解構函式 ~Demo() { cout << "Destructor" << endl; // 刪除動態資源 delete[] IntPtr; } }; class test { public: int x; }; void dosomething(); void dosomething() { cout << "hello world" << endl; } //若聲明變數不帶初始化器時會發生default-initialization //靜態變量 與 全域變量 default-initialization 為 0 int global_int; char global_char; static int static_global_int; float global_float; double global_double; int *global_pointer; test global_t; int main() { static int static_local_int; int local_int; char local_char; float local_float; double local_double; int *local_pointer; test local_t; static test static_local_t; cout << global_int << endl;//0 cout << global_char << endl;//'\0' cout << static_global_int << endl;//0 cout << global_float << endl;//0.0 cout << global_double << endl;//0.0 cout << global_pointer << endl;//0x00000000 cout << global_t.x << endl;//0 Demo demo;// //cout << static_local_int << endl;//0 //cout << static_local_t.x << endl;//0 //cout << local_int << endl;//不確定值 //cout << local_char << endl;//不確定值 //cout << local_float << endl;//不確定值 //cout << local_double << endl;//不確定值 //cout << local_pointer << endl;//不確定值 //cout << local_t.x << endl;//不確定值 return 0; }輸出 :
0 0 0 0 00000000 0 default constructor Destructor
◎list initialization
發生時機 :
- C++11新加入。
- 使用{}。
- direct list initialization , 如 : T object{arg1, arg2, ...} 。
- copy list initialization , 如 : T object = {arg1, arg2, ...} 。
direct list initialization
double direct_list_initialization{ 1.5 }; vector<int> Vect{ 1,2,3,4 }; new int{1};copy list initialization
double copy_list_initialization = { 1.5 }; vector< int> Vect = { 1,2,3,4 }; int object[] = { 1, 2};
◎vaule initialization
發生時機 :
- 使用了初始化器( ()、{} )卻沒有提供初始值args。
- 內置類型(int、float、double...) initialization為 0。
- 若為class類型,則會調用默認建構函式。
vector<int> Vect(10);//10格int皆初始化為0 vector<bool> Vect2(10);//10格bool皆初始化為false int *pointer = new int();
◎zero initialization
發生時機 :
- 靜態變量於其他初始化前會先進行。
- 數組初始化時,其他數量不夠未被初始化的部分
- 若為class類型,value initialization初始化沒有構造函式的成員時會進行。
static int a; int arr[5] = { 1,2 }; for (int i = 0; i < 5; i++) cout << arr[i] << endl;// 1 2 0 0 0
留言
張貼留言