C 新特性 關於類1

2021-08-02 22:21:22 字數 1382 閱讀 5185

1.使用=default生成預設建構函式

在c++11新標準中,如果我們需要預設的行為,那麼可以通過在引數列表後面寫上=default來要求編譯器生成建構函式。其中,=default既可以和宣告一起出現在類的內部,也可以作為定義出現在類的外部。和其他函式一樣,如果=default在類的內部,則預設的建構函式是內聯的;如果它在類的外部,則該成員預設情況下不是內聯的。

2.預設初始化

如果內建型別的變數未被顯示初始化,它的值由定義的位置決定。定義在任何函式體外面的值被初始化為0.定義在函式體內部的內建變數不被初始化。乙個未被初始化的內建型別變數是未定義的。如果師徒拷貝或者以其他形式訪問詞類值將引發錯誤。

新標準規定:可以為資料成員提供乙個類內初始值。建立物件時,類內初始值將用於初始化資料成員,沒有初始值的成員將被預設初始化。

當我們初始化類型別成員時,需要為建構函式傳遞乙個符合成員型別的實參。類內初始值必須使用=的初始化形式(初始化類的資料成員時所用)或者花括號括起來的直接初始化形式。 例如

class screen

class window;

}

委託建構函式

乙個委託建構函式使用了它所屬類的其他建構函式執行它的初始化過程,或者說它把它自己的一些(或者全部)的職責委託給了其他的建構函式。

和其他建構函式一樣,乙個委託建構函式也有乙個成員初始值的列表和乙個函式體。在委託建構函式內,成員初始值列表只有乙個唯一的入口,就是類名本身。和其他成員初始值一樣,類名後面緊跟圓括號括起來的引數列表,引數列表必須與類中另乙個建構函式匹配。

class sales_data

sales_data() :sales_data("", 0, 0){}

sales_data(string s) :sales_data(s, 0, 0){}

sales_data(istream &is) :sales_data()

};

在這個sales_data中,除了第乙個建構函式外,其他的建構函式都委託了他們的工作。第乙個建構函式接受三個實參,使用這些實參初始化資料成員。然後結束工作(函式體為空,所以沒有執行動作)。我們定義的預設建構函式使用接受三個實參的建構函式完成初始化工作,他也無須執行其他任務。接受乙個string的建構函式同樣委託了三引數的建構函式版本。

接受istream&的建構函式也是委託函式,它委託了預設建構函式,預設建構函式接著委託給三引數的建構函式。當這些受委託的建構函式執行完後,接著執行istream&建構函式體內的內容。它的建構函式體呼叫read函式讀取給定的istream.

當乙個建構函式委託給另乙個建構函式時,受委託的建構函式的初始值列表和函式體被一次執行。在sale_data類中,受委託的建構函式體恰是空的。假如函式體包含有**的話,將先執行這些**,然後控制權才會還給委託者的函式體。

c 11 新特性學習(1)

1.原始字面量 在 c 11 中新增了定義原始字串的字面量,定義方式為 r 原始字串 其中 兩邊的字串可以省略。原始字面量 r 可以直接表示字串的實際含義,而不需要額外對字串做轉義或連線等操作。如 n t縮排這種 比如 程式設計過程中,使用的字串中常帶有一些特殊字元,對於這些字元往往要做專門的處理,...

C 3 0中的新特性(1)

1.隱式型別 以前這樣宣告變數 string str hello world 現在可以寫成 var str hello world str仍然被認為是string型別,因為c 編譯器根據初始值可以判斷出來。所以這種寫法要求在宣告變數時必須提供初始值。下面是陣列的寫法 var points new 注...

C 3 0中的新特性(1)

1.隱式型別 以前這樣宣告變數 string str hello world 現在可以寫成 var str hello world str仍然被認為是string型別,因為c 編譯器根據初始值可以判斷出來。所以這種寫法要求在宣告變數時必須提供初始值。下面是陣列的寫法 var points new 注...