c primer讀書筆記之c 11(一)

2022-05-28 02:09:09 字數 2873 閱讀 1410

c++提供了使用typedef定義的別名機制,但是有時候很難理解。為了更好的使用別名機制,c++11提供了新的別名定義機制,類似**如下:

//

alias declarations

using vint = int; //

type alias

using pint = int *; //

pointer alias

using rint = int &; //

reference alias

using myfunc = int (*)(void); //

function pointer alias

vint i = 99

; pint pi = &i;

rint ri =i;

myfunc func = nullptr;

c++11擴充套件了auto的函式,編譯器可按照實際的初始化引數推斷需要的引數型別,並初始化之。其用法類似下面**:

//

item初始化為val1+val2的結果

auto item = val1 + val2;

需要注意的一點是,auto、const以及引用型別一起使用的時候其語法可能不是簡單的型別推斷,編譯器推斷型別的機制可能與我們能想到的簡單推斷不太一致。也就是說如果需要定義auto引用、auto常量時需要明確指定,否則直接使用auto編譯器會簡單的使用對應的型別,而直接忽略const和引用的限制。相關簡單示例**如下:

/*

auto specifier

*///

a_i is int, a_pi is a pointer to int, a_ri is a reference to int

auto a_i = 0, *a_pi = &a_i, &a_ri =a_i;

//error like this, for a_f is float while a_d is double

//auto a_f = 0.0f, a_d = 0.0;

c++11提供了新的型別推斷關鍵字decltype,主要用於自動推斷表示式型別,但不需要初始化的情況(auto提供了推斷型別+初始化)。

//

result is any type that expr has.

decltype(expr) result;

與auto自動型別推斷相比,decltype的自動型別推斷很直接,expr是什麼型別,通常decltype返回也是一樣的型別。用法如下:

/*

decltype specifier

*/const

int ci = 0, &cr = ci, *cp = &ci;

decltype(ci) x = 0;//

x has type const int

decltype(cr) y = x;//

y has type const int &

decltype(cr) z;//

error,z is a reference and must be initialized

decltype(cr+0) b;//

b has type int

decltype(*cp) c;//

error, c is a reference and must be initialized

int i = 100

; decltype(i) d;

//d has type int

decltype((i)) e;//

error ,e is a reference and must be initialized

需要區分兩點,對於有括號的情況、以及指標取值的情況,decltype返回的是左值引用(上面**中的後兩個error)。

c++本身的for迴圈需要三個語句,初始化、條件、增量,對於有些操作需要額外寫很多**。針對需要遍歷stl容器中的每個元素的情況,可以考慮使用range for。其具體語法如下:

for

(declaration:expression)

statement;

比如我們把std::string的字母全部變成小寫字母可以這麼寫:

/*

range for

*/using std::string;

string str("

upper test");

for (auto &c : str)

c = tolower(c);

尤其是配合auto和decltype使用,更可以節省很多**(相信大家都有使用stl迭代器的經驗,**很長,但功能就是為了遍歷)。

需要注意一點,range for在使用時不能向容器中插入或刪除元素,只能修改。

結合c++11,變數初始化有以下幾種方式:

int x = 0

;int x = ; // list initialization

int x(0

);int x; // list initialization

針對stl模板定義也提供了新的形勢,示例**如下:

/*

vector

*/vector

int>>ivec;

//list initialization

vector strvec;

vector

v2;

vector

v3;

vector

v4;

使用大括號的通常是列表初始化,但是某些情況也不是,比如上例中v3、v4實際呼叫的vector的建構函式(這是編譯器做的處理,在初始化列表中的型別和模板型別不匹配時)。

c primer讀書筆記之c 11(三)

class ctordfttype 使用 default限定符的建構函式,不需要實現,編譯器會自動生成預設的函式實現。如果需要禁止類物件間的複製或者賦值,傳統的做法是將複製建構函式和賦值運算子設定為private。c 11提供了的 delete限定符用於實現類似的功能,delete限定符可用於任何函...

c primer讀書筆記之c 11(四)

相信大家都用過列舉量,都是不帶有作用域的,在標頭檔案中定義需要特別注意不要出現重名的情況。為了解決這種問題,c 11提供了帶作用於的列舉。可以使用class enumname定義,示例 如下 enum enum class color 上面的是沒有作用域的列舉定義形式,下面是帶有作用域的列舉定義形式...

C 11特性 《深入理解C 11 讀書筆記

新增關鍵字 struct alignas 32 colorvector 沒有alignas關鍵字的話,對齊到8位,加上的話,對齊到32位,能提公升效率。對齊的資料在讀寫上會有效能上的優勢。比如頻繁使用的資料如果與處理器的快取記憶體器大小對齊,有可能提高快取的效能。而資料不對齊可能造成一些不良的後果,...