C 類裡面的建構函式初始化列表

2021-10-22 04:42:20 字數 947 閱讀 6308

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如:

class cexample 

//建構函式內部賦值

cexample()

};

上面的例子中兩個建構函式的結果是一樣的。

上面的建構函式(使用初始化列表的建構函式)顯式的初始化類的成員;

而沒使用初始化列表的建構函式是對類的成員賦值,並沒有進行顯式的初始化。

簡單理解顯式初始化即為手工給予初值,否則為隱式初始化,將內容設定為預設值。

自動變數在執行時進入函式的時候,才進行分配空間賦值。非自動變數會自隱式清零,而自動變數是不會自隱式清零的。若沒有在定義變數時顯式初始化,未賦值前,該變數的內容是不確定值。

分配空間給變數後,賦予初值稱為初始化。

非自動變數是在編譯期分配其空間,可以顯式(即手工)給予初值,否則會隱式把該空間內所有內容設為零。

初始化和賦值對內建型別的成員沒有什麼大的區別,像上面的任乙個建構函式都可以。對非內建型別成員變數,為了避免兩次構造,推薦使用類建構函式初始化列表。但有的時候必須用帶有初始化列表的建構函式:

自動變數(編譯器自動分配記憶體的變數)是執行時每次進入函式時,才分配空間的。同一變數名實際上會對應不同的空間(例如考慮遞迴時的情況)。與非自動變數不同,自動變數是不會自隱式清零的。若沒有在定義變數時顯式初始化,未賦值前,該變數的內容是不確定值。

為什麼要有這種區別呢?都自動清零不是更安全麼?

其中乙個原因是,非自動變數只有乙份,可以在編譯、鏈結及載入過程初始化其值,而沒有什麼執行時開銷。相反,自動變數進行初始化是有執行時開銷的。有時候我們的確只需為變數分配空間而不需初始化,例如sprintf(buffer, ...)中的buffer若是自動變數,為它初始化是徒勞無功的。所以c語言設計時為了效能,便容許自動變數不進行初始化。這和許多語言不一樣。

C 類建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 你可能以為上面的 將會首先做m y i,然後做m x m y,最後它們有相同的值。但是編譯器先初始化m x,然後是m y,因為它們是按這樣的順序宣告的。結果是m x將有乙個不可 的值。...

C 類建構函式初始化列表

在使用c 程式設計的過程當中,常常需要對類成員進行初始化,通常的方法有兩種 第一種方法 1.cmyclass csomeclass 2.第二種方法 1.csomeclass csomeclass x 0 y 1 2.本文將要 這兩種方法的異同以及如何使用這兩種方法。從技術上說,第二種方法比較好,但是...

C 類建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函式 顯式的初始化類的成員 而沒使用初始化列表的建構函...