C 11新特性 二

2021-10-04 22:07:46 字數 3787 閱讀 2968

目錄

=default, = delete 配合建構函式和拷貝賦值 一起使用

alias template(template typedef)

type alias別名

using

noexcept

override

final

decltype

lambda

右值引用

對於乙個空的class c++編譯器處理之後就會不在是乙個空的class 因為編譯器會為這個class新增

copy ctor

copy assignment operator(=)

dtor

就是big three 如果你沒有宣告ctor 編譯器會為你宣告乙個default ctor且都是public inline的

目的:是為了在這些函式中新增一些預設的行為,比如在ctor中呼叫父類的ctor或者dtor中呼叫父類的dtor

class empty{}; ==>

class empty

~empty()

empty(const empty& e) // 預設行為是乙個位一位的拷貝

empty& operator-()(const empty& e)

}

如果乙個類中包含指標物件 就需要自己實現 big three

參考:

templateusing vec = std::vector>;//給乙個化名

veccoll;

//typedef 做不到,typedef不能接受引數

//define 也不行

//#define vectemplatestd::vector>;

//veccoll;

// typedef void(*func)(int, int);

// func是乙個型別 是乙個函式指標

// 和typedef沒有區別

using func = void(*)(int, int);

void example(int, int) {};

// 函式名就是乙個函式指標

func fn = example;

一般的using關鍵子我們都是用來宣告當前檔案的命名空間,比如標準庫的命名空間std-> using namespace std;

但在c++11中,它的用處還有幾個 1:取代typedef  ,2:讓父類同名函式在子類中以過載方式使用.

// #1 using namespace std; using std::count;

// #2 宣告成員函式 base::test

// #3 用於alias

在函式後面加上 noexcept 說明保證函式一定不會產生異常。該關鍵字告訴編譯器,函式中不會發生異常,這有利於編譯器對程式做更多的優化。如果在執行時,noexecpt函式向外丟擲了異常(如果函式內部捕捉了異常並完成處理,這種情況不算丟擲異常),程式會直接終止,呼叫std::terminate()函式,該函式內部會呼叫std::abort()終止程式。

void foo() noexcept;

void foo() noexcept(true); // 表明在上面條件下不會丟異常

在成員函式宣告或定義中, override 確保該函式為虛函式並覆寫來自基類的虛函式。

位置:函式呼叫運算子之後,函式體或純虛函式標識 「= 0」 之前。

注意在派生類的成員函式中使用override時,如果基類中無此函式,或基類中的函式並不是虛函式,編譯器會給出相關錯誤資訊。

1、禁用繼承:c++11中允許將類標記為final,方法時直接在類名稱後面使用關鍵字final,如此,意味著繼承該類會導致編譯錯誤。

例項如下:

class super final

;

2、禁用重寫: c++中還允許將方法標記為fianal,這意味著無法再子類中重寫該方法。這時final關鍵字至於方法引數列表後面,如下

class super

;

這個關鍵字的功能類似 typeof 返回物件的型別。它的作用是選擇並返回運算元的資料型別,在此過程中,編譯器分析表示式並得到它的型別,卻不實際計算表示式的值。

總結:decltype和auto都可以用來推斷型別,但是二者有幾處明顯的差異:1.auto忽略頂層const,decltype保留頂層const;2.對引用操作,auto推斷出原有型別,decltype推斷出引用;3.對解引用操作,auto推斷出原有型別,decltype推斷出引用;4.auto推斷時會實際執行,decltype不會執行,只做分析。總之在使用中過程中和const、引用和指標結合時需要特別小心。

templateauto add(t1 x, t2 y) -> decltype(x+y);

// error 因為編譯到decltype(x+y)的時候 編譯器不知道xy是什麼東西

templatedecltype(x+y) add(t1 x, t2 y);

// auto cmp由編譯器推導出型別

auto cmp = (const person& p1, const person& p2)

// set需要傳遞乙個函式型別 用decltype可以得出

std::setcoll(cmp);

參考:cnblogs.com/cauchy007/p/4966485.html

lambda沒有構造和賦值函式。利用lambda表示式,可以方便的定義和建立匿名函式。

[...]中傳遞外部的變數

[&]傳引用 mutable表示放在裡面的變數可變 > > [=]表示預設接收外界的所有變數

右值引用是新型的引用型別 幫助避免不必要的複製

當賦值的右手邊是乙個右值的時候 左手邊的接受端可以偷右手邊的資源而不需要執行allocation動作

lvalue 可以出現在 = 左邊 (左值表示變數的位址)

rvalue 只能出現在 = 右邊 (右值表示儲存的真實的值)

類的臨時物件是乙個右值,臨時變數一定被當成右值,因為臨時物件建立之後 不會再被使用 所以直接把右值資料引用給別的變數,有時候乙個左值在後面不會被用到,那麼就可以使用move語義 把左值轉成右值。

右值引用我的理解是編譯器提供了乙個介面 允許你進行賦值的時候直接使用右值的記憶體空間(其實就是將指標指向這塊空間,當然在進行copy ctor和copy asgn的時候你需要自己實現操作,因為當你實現了右值引用的機制後編譯器會自動呼叫你實現的函式),對於一些左值 但是如果在接下來的scope中你用不到了 在進行賦值的時候可以使用move語句將左值轉變為右值,因為左值後面用不到了所以你可以把左值指向的記憶體的指標給刪除(注意一定要刪除指標,因為當這個左值的scope結束後,編譯器會呼叫析構函式,如果沒有刪除指標,會把你move出去的這塊記憶體給刪除所以就造成了錯誤)

參考:

c 11 新特性 (二)

1.nullptr 專門形容指標為空 2.強類列舉 enum direction enum answer 3靜態斷言,可在編譯時作判斷 static assert size of int 4 4.建構函式的相互呼叫 delegating constructor class a a int x,int...

C 11新特性總結 二

c 11 引入了一種更為簡單的for語句,這種for語句可以很方便的遍歷容器或其他序列的所有元素 vectorvec for int x vec 如果要定義指向這個陣列的指標呢 int p arr 10 arr 注意 int p arr 10 表示乙個陣列,有10個元素,元素型別是int 如果要定義...

C 11新特性學習筆記(二)

c 11引入了lambda 匿名函式 這樣就可以在乙個函式只需呼叫一次的地方使用了,類似內聯函式。c 11 的 lambda 表示式規範如下 capture params mutable exception attribute ret 1 capture params ret 2 capture p...