__cplusplus 其實被定義為乙個整數 , c++03 中被定義為199711l , c++11 中被定義為201103l .可以通過下面的**檢測編譯器是否支援c++11 .
#if __cplusplus < 201103l
#error "should use c++11 implementation"
#endif
列舉的作用域即是它所在的namespace
, 有是他的父 作用域 。
例子 :
enum
type
;type t1 = general; // correct
type t2 = type::general ; // also correct
c++98 的sizeof不能使用非static的類成員作為引數, c++ 11 則可以 .例子 :
class test
;#include
using
std::cout;
using
std::endl;
int main()
c++11的friend 關鍵字不必再寫class .例子支援模板作為friend. 如果模板的例項化是乙個基本型別, 那麼就忽略這個友元.
template
class test
;class friendclass ;
typedef testnofriend test ;
typedef testhasfriend test;
對於虛函式(非純虛) , 使用final關鍵字可以阻止派生類過載繼續這個介面.例子:
#include
using std::cout;
using std::endl;
class grandpa
;class father : public grandpa
//error: overriding final function 『virtual void father::print()』
};
使用override關鍵字修飾函式, 指明這個函式是過載了父類的介面, 如果不是,則會編譯出錯 .例子:
class father
};class son : public father
//error: 『virtual void son::aa()』 marked override, but does not override
};
支援帶有預設 值/型別 的函式模板.具體例子請自習查閱書籍.支援外部(extern) 模板
支援區域性/匿名型別作為模板實參, 但是這個區域性/匿名型別的宣告不能出現在模板實參位置.
繼承建構函式的例子 :用途:
1.1.1 父類的建構函式眾多
1.1.2 派生類新增的資料項較少, 可以通過指定預設值(c++11) 的方式初始化
注意:
1.2.1 多重繼承的時候注意建構函式衝突問題
委派建構函式
用途 2.1.1 各種建構函式有部分相同的工作
2.1.2 在初始化列表中使用, 類似父類建構函式的使用
注意:
2.3 注意不應該產生環狀依賴
#include
using
std::cout;
using
std::endl;
class father
// 委派給只有乙個引數的建構函式 .
father(int i) : father(i,2){} // 委派給最詳細賦值的建構函式 .
father(int i, int j) : a(i) , b(j){}
void print() ;
class son : public father
;int main()
// c++98 error , c++11 pass
int a = ;
int b ;
vector
c(1,2,3);
int i = 1024;
int j = 10 ;
char c = ; // error , narrowing and miss data
char c = ; // pass , narrowing but no data miss.
右值 , 右值引用 , 移動語義 , std::move
右值引用t &&
移動建構函式t( t && )
移動語義在需要深層拷貝的類有巨大作用(不必重新開闢記憶體).理論上
t( const t && )
是可以的 , 但是沒有意義, 移動語義決定了我們應該去改變這個右值 .
std::move(a)
返回a
轉化為的右值 , 但是a
本身並沒有消亡,a
變數被移動函式改變過之後, 或許資料已經混亂, 不應該繼續作為普通左值使用.
template< class t>
void iamforwarding< t && t>
自定義字面值
定義函式 :
t operator ""_x( p ) {}
其中t為目標類,_x為字面值字尾 ,p是" "
部分的型別 , 作為引數傳入(整形 , 浮點 , 字元) .
例子 :
struct walt
walt operator
""_w(unsigned
int v)
; return w;
}int main()
auto 自動型別推導
如果你不像寫aaa:::bbb:::ccc::ddd i = gen***();
, 試一試auto i = gen***();
.
decltype 提取型別
int i;
decltype(i) j ; // 提取i的型別來定義j
#### 列舉
enum class *** : ***[ int , char , long … ] ;
auto
慢慢學習~~
《深入理解C 11 新特性解析與應用》 讀書筆記
第六章 在 c 11中,nullptr 是乙個所謂的 指標空值型別 的常量,指標空值型別被命名為nullptr t。nullptr 是有型別的,且可以被隱式地轉化為指標型別。第二章異常機制會帶來一些額外開銷,比如函式丟擲異常,會導致函式棧被依次地展開,並依幀呼叫在本幀中已構造的自動變數的析構函式等。...
C 11新特性解析與應用 lambda部分
lambda 的 方式,根據lambda的實現知道 方式為傳值,在lambda定義的時候,初始化狀態就確定了 方式為引用,那麼引用的物件或者變數,會根據lambda執行的時候,再確定初始化狀態 這一點很重要 我們可以用 typeid lambda name 來看看不同編譯器,對於lambda的型別到...
C 11特性 《深入理解C 11 讀書筆記
新增關鍵字 struct alignas 32 colorvector 沒有alignas關鍵字的話,對齊到8位,加上的話,對齊到32位,能提公升效率。對齊的資料在讀寫上會有效能上的優勢。比如頻繁使用的資料如果與處理器的快取記憶體器大小對齊,有可能提高快取的效能。而資料不對齊可能造成一些不良的後果,...