深入理解C++11 第二章相容性穩定性 學習筆記
阿新 • • 發佈:2019-01-30
1 __func__預定義識別符號
基本功能為返回所在函式的名字
我的VS2013上試了一下,發現C++環境中貌似需要用__FUNCTION_,結果一樣
上程式碼
函式輸出 hello world
2 C++11 標準中定義了與#pragma功能相同的操作符_Pragma 其用法與sizeof等操作符一樣
區別:_Pragma可以在巨集中展開,而#pragma不可以,_Pragma用起來更加靈活
3 C99中得到變長引數巨集定義 __VA_ARGS__
4 C++11整型引入 long long
tips:要檢視平臺上long long型別大小可以去檢視 <limit.h> 檔案中的LLONG_MIN 和 LLONG_MAX
5 C++11規定,擴充套件的整型必須和標準的整型一樣,有符號型和無符號型佔用相同大小空間。
6 巨集__cplusplus 判斷是否為C++編譯環境
7 斷言 assert巨集 執行時斷言 可用 NDUBUG 禁用assert巨集
8 C++11 新引入的static_assert 編譯期斷言
接收兩個引數,第一個引數為斷言表示式,第二個為編碼者自定義的警告資訊。 注:static_assert斷言表示式的結果必須是在編譯時期可以計算的表示式,即必須是常量表達式。
9 異常
C++11中不再使用 throw(...) {...}, 被新的noexcept異常宣告取代
noexcept 表示其修飾的函式不會丟擲異常,如果noxcept修飾的函式丟擲了異常,編譯期會直接呼叫std::terminate() 來終止程式執行。寫法為:
void fun() noexcept;
void fun() noexcept(常量表達式);
示例程式碼:
noexcept作為操作符時可用於template
template<class T> void fun() noexcept(noexcept (T())) {}
這裡面的第二個noexcept為操作符,意義為 fun是否為一個noexcept函式將由T是否為一個noexcept函式決定。
10 非靜態成員的sizeof
在C++11中,對非靜態成員使用sizeof 是合法的。
11 擴充套件friend語法
在C++11中,宣告一個類為另一個類的友元時,不再需要使用class關鍵字。
這使得為類模板宣告友元成為可能。
12 C++11 新增using定義類型別名 作用與typedef一樣。
13 final/override 控制
C++中有一個特點,就是基類宣告為virtual的函式,之後的過載版本都不需要再宣告該函式為virtual.(這條特性有利有弊啊)
override: 如果派生類在虛擬函式宣告時使用了override描述符,那麼該函式必須過載其基類中的同名函式,否則程式碼無法編譯通過。(override用來做輔助檢查工作的)
14模板函式的預設模板引數
在C++11中模板和函式一樣,可以有預設引數了。
類模板在為多個預設引數指定預設值得時候需要“從右往左”,函式模板不需要。
15 外部模板
template<typename T>void fun(T) {}
extern template void fun<int>(int);
C++11 引入此特性的目的是減輕編譯器壓力,減少冗餘程式碼。
16 C++11中不再對區域性和匿名型別做模板實參加限制。 在C/C++中,即使是匿名型別的宣告,也需要獨立的表示式語句。
#include "stdafx.h" #include <string> #include <iostream> using namespace std; const char* hello(){ return __FUNCTION__; //__func__ } const char* world(){ return __FUNCTION__;//__func__ } int _tmain(int argc, _TCHAR* argv[]) { std::cout << hello() << "," << world() << endl; return 0; }
#include "stdafx.h" #include <cassert> char *ArrayAlloc(int n) { assert(n > 0); return new char[n]; } int _tmain(int argc, _TCHAR* argv[]) { char* a = ArrayAlloc(0); return 0; }
#include "stdafx.h" #include <iostream> using namespace std; void Throw(){ throw 1; } void NoBlockThrow(){ Throw(); } void BlockThrow() noexcept { Throw(); } int _tmain(int argc, _TCHAR* argv[]) { try { Throw(); } catch (...) { cout << "Found Throw" << endl; } try { NoBlockThrow(); } catch (...) { cout << " Throw is not blocked" << endl; } try { BlockThrow(); } catch (...) { cout << "Found Throw 1" << endl; } return 0; }
16 C++11中不再對區域性和匿名型別做模板實參加限制。 在C/C++中,即使是匿名型別的宣告,也需要獨立的表示式語句。