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位,能提公升效率。對齊的資料在讀寫上會有效能上的優勢。比如頻繁使用的資料如果與處理器的快取記憶體器大小對齊,有可能提高快取的效能。而資料不對齊可能造成一些不良的後果,...