深入理解C 11 筆記

2021-10-10 14:18:27 字數 1535 閱讀 1979

#include

using

namespace std;

classa~

a()// 對於含有堆記憶體的類,需要提供深拷貝的拷貝建構函式,避免預設的拷貝構造使用淺拷貝導致堆記憶體的重複刪除。a(

const a& a)

:m_ptr

(new

int(

*a.m_ptr)

)// 通過移動構造,a&&作為函式引數,只使用淺拷貝避免臨時物件的拷貝

a(a&& a)

:m_ptr

(a.m_ptr)

private

:int

* m_ptr;};

// get函式中存在通過乙個臨時變數拷貝構造了乙個新的物件返回,臨時變數在拷貝構造完成之後就銷毀了,因此會帶來額外的效能損耗。

a get()

intmain()

std::move語義就是將左值轉換為右值,將物件的狀態或者所有權從乙個物件轉移到另乙個物件,並且只是轉移沒有記憶體拷貝。

例如容器的拷貝,如果使用move語義可以避免物件的拷貝。

std::list tokens;

std::list t = std::

move

(tokens)

;

void

processvalue

(int

& i)

void

processvalue

(int

&& i)

intmain()

右值引用還適用於這樣的場景:需要將一組引數原封不動的傳遞給另乙個函式

std::forward語義,如果乙個右值引用做為函式的引數,在函式內部在**該引數的時候就會又變成乙個左值,c++11提供的forward就是為了解決這種問題,按照引數本身的型別而**。

int x =0;

decltype

(x) y =1;

decltype

(x+y) z =

2;

decltype多用於泛型程式設計當中

typedef

unsigned

int uint_t;

typedef的侷限在於無法重定義乙個模板,

例如有如下場景:

typedef std::mapint> map_int_t;

typedef std::map map_string_t;

typedef就需要定義兩次,如果使用using關鍵字就可以寫為:

template

<

typename v>

using str_map_t = std::map

;

《深入理解C 11》筆記 decltype

本篇將介紹decltype的用法。decltype與auto類似,也能進行型別推導,但是用法有一定的區別,decltype推導出的型別能作為型別宣告變數 int main decltype的應用 一種是decltype和typedef using的合用 using size t decltype s...

《深入理解C 11》筆記 追蹤返回型別

templatedecltype 2 a doublevalue t a 用decltype推導返回型別但是對於編譯器來說,是從左到右進行編譯的,decltype在進行推導時並不知道a的型別,所以這種寫法是編譯不過的。為了解決這個問題,於是引入了追蹤返回型別 template auto double...

《深入理解C 11》筆記 強型別列舉

本篇開始介紹第五章的內容 強型別列舉。列舉enum的使用應該十分常見,用於定義同一類的資料。但是列舉其實存在一定的問題 enum male enum female 如上 如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的...