淡:
....................
....................
C++11
C++11,先前被稱作C++0x,即
ISO/IEC 14882:2011。
Wikipedia:C++11
Wikipedia: C++ Technical Report 1
C++11/14/17 Features In VS 2015 RTM
右值引用
C++11增加一個(gè)新的非常量引用(reference)類型,稱作右值引用(R-value reference),標(biāo)記為T &&。右值引用所綁定的臨時(shí)對(duì)象可以在該臨時(shí)對(duì)象被初始化之后做修改,這是為了允許move語義。(Wikipedia:C++11)
POD
Wikipedia:
POD (程序設(shè)計(jì))
Plain old data structure, 縮寫為POD, 是C++語言的標(biāo)準(zhǔn)中定義的一類數(shù)據(jù)結(jié)構(gòu)[1],POD適用于需要明確的數(shù)據(jù)底層操作的系統(tǒng)中。
說人話:POD是標(biāo)準(zhǔn)委員會(huì)的老家伙們搞的一組底層數(shù)據(jù)標(biāo)準(zhǔn),想讓某些C++對(duì)象可以跨平臺(tái)交互。
Lambda
[] // 沒有定義任何變量。使用未定義變量會(huì)引發(fā)錯(cuò)誤。
[x, &y] // x以傳值方式傳入(默認(rèn)),y以引用方式傳入。
[&] // 任何被使用到的外部變量都隱式地以引用方式加以引用。
[=] // 任何被使用到的外部變量都隱式地以傳值方式加以引用。
[&, x] // x顯式地以傳值方式加以引用。其余變量以引用方式加以引用。
[=, &z] // z顯式地以引用方式加以引用。其余變量以傳值方式加以引用。
nullptr
C++11引入了新的關(guān)鍵字來代表空指針常量:nullptr,將空指針和整數(shù)0的概念拆開。nullptr的類型為nullptr_t,能隱式轉(zhuǎn)換為任何指針或是成員指針的類型,也能和它們進(jìn)行相等或不等的比較。而nullptr不能隱式轉(zhuǎn)換為整數(shù),也不能和整數(shù)做比較。(wikipeida:C++11)
為了向后兼容,0仍可代表空指針常量。
枚舉類別的前置聲明(forward declaration)
0000
enum Enum1; // C++與C++11中不合法;無法判別大小
enum Enum2 : unsigned int; // 合法的C++11
enum class Enum3; // 合法的C++11,列舉類別使用預(yù)設(shè)型別int
enum class Enum4: unsigned int; // 合法的C++11
enum Enum2 : unsigned short; // 不合法的C++11,Enum2已被聲明為unsigned int
using別名
類型別名
using也能在C++11中定義一般類型的別名,等同typedef:
typedefvoid(*PFD)(double); // 傳統(tǒng)語法
usingPFD=void(*)(double); // 新增語法
模板別名
template< typename first, typename second, int third>
class SomeType;
template< typename second>
using TypedefName = SomeType
;
可變參數(shù)模板
在C++11之前,不論是類模板或是函數(shù)模板,都只能按其被聲明時(shí)所指定的樣子,接受一組固定數(shù)目的模板參數(shù);C++11加入新的表示法,允許任意個(gè)數(shù)、任意類別的模板參數(shù),不必在定義時(shí)將參數(shù)的個(gè)數(shù)固定。
template<typename...Values>classtuple;
使用或禁用對(duì)象的默認(rèn)函數(shù)
傳統(tǒng)C++默認(rèn)構(gòu)造函數(shù)規(guī)則:
若用戶定義了任何構(gòu)造函數(shù),編譯器便不會(huì)生成默認(rèn)構(gòu)造函數(shù)。
否則,編譯器自動(dòng)生成四個(gè)構(gòu)造函數(shù):默認(rèn)構(gòu)造函數(shù)(default constructor)、復(fù)制構(gòu)造函數(shù)(copy constructor),賦值運(yùn)算符(copy assignment operatoroperator=)以及析構(gòu)函數(shù)(destructor)
C++11允許顯式地表明采用或拒用編譯器提供的內(nèi)置函數(shù)
structNonCopyable
{
NonCopyable&operator=(constNonCopyable&)=delete;
NonCopyable(constNonCopyable&)=delete;
NonCopyable()=default;
};
= delete的聲明(同時(shí)也是定義)也能適用于非內(nèi)置函數(shù),禁止成員函數(shù)以特定的形參調(diào)用:
structNoDouble
{
voidf(inti);
voidf(double)=delete;
};
static_assert
想在編譯器測(cè)試模板參數(shù)的特性,只能用static_assert
template
structCheck
{
static_assert(sizeof(int)<=sizeof(T),"T is not big enough!");
};
hash
C++11四種散列表,其中差別在于底下兩個(gè)特性:是否接受具相同鍵值的項(xiàng)目(Equivalent keys),以及是否會(huì)將鍵值映射到相對(duì)應(yīng)的數(shù)據(jù)(Associated values)。為避免與第三方庫發(fā)展的散列表發(fā)生名稱上的沖突,前綴將采用unordered而非hash。
散列表類型 有無關(guān)系值 接受相同鍵值
std::unordered_set 否 否
std::unordered_multiset 否 是
std::unordered_map 是 否
std::unordered_multimap 是 是
頭文件: <unordered_set>和<unordered_map>
正則表達(dá)式
頭文件:<regex>
通用智能指針
shared_ptr是一引用計(jì)數(shù)(reference-counted)指針,其行為與一般C++指針極為相似。在TR1的實(shí)現(xiàn)中,缺少了一些一般指針?biāo)鶕碛械奶厣袷莿e名或是指針運(yùn)算。C++11新增前述特色。
一個(gè)shared_ptr只有在已經(jīng)沒有任何其它shared_ptr指向其原本所指向?qū)ο髸r(shí),才會(huì)銷毀該對(duì)象。
一個(gè)weak_ptr指向的是一個(gè)被shared_ptr所指向的對(duì)象。該weak_ptr可以用來決定該對(duì)象是否已被銷毀。weak_ptr不能被解引用;想要訪問其內(nèi)部所保存的指針,只能透過shared_ptr。有兩種方法可達(dá)成此目的。第一,類別shared_ptr有一個(gè)以weak_ptr為參數(shù)的構(gòu)造函數(shù)。第二,類別weak_ptr有一個(gè)名為lock的成員函數(shù),其回返值為一個(gè)shared_ptr。weak_ptr并不擁有它所指向的對(duì)象,因此不影響該對(duì)象的銷毀與否。
元編程
對(duì)于那些能自行創(chuàng)建或修改本身或其它程序的程序,我們稱之為元編程。這種行為可以發(fā)生在編譯或運(yùn)行期。
XXXX
0000
0000
XXXX
0000
0000