C++ - initialization (C++軟體開發 - 初始化 概念與實例)

Default 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

留言