C++11部分特性

預(yù)定義宏

1. func預(yù)定義標(biāo)識符

功能:返回所在函數(shù)的名字
C++11中甚至允許在類或結(jié)構(gòu)體中使用:

#include<iostream>
using namespace std;

class TestStruct {
public:
  TestStruct () : name(__func__) {}
  const char *name;
}; 

int main() {
  TestStruct ts;
  cout << ts.name <<endl; 
}

原理:編譯器隱式地在函數(shù)定義后定義func表示符
所以需要注意的是func不能作為函數(shù)參數(shù)的默認(rèn)值泰偿,因?yàn)樵趨?shù)聲明的時(shí)候敞峭,func還沒有被定義

void testFun(string func_name = __func__) {};  //compile error

2.宏__cplusplus

C++11的__cplusplus被預(yù)定義為201103L靖苇,可以用

#ifdef __cplusplus < 201103L
    #error "please use C++11 implementation"
#endif

進(jìn)行檢測

靜態(tài)斷言

assert函數(shù)是在運(yùn)行時(shí)進(jìn)行斷言球涛,而當(dāng)需要在編譯時(shí)斷言則需要使用靜態(tài)斷言,在C++11中辕坝,引入了static_assert拆座,接受兩個(gè)參數(shù)匪傍,static_assert ( bool_constexpr , message )一個(gè)是斷言表達(dá)式(通常返回bool值)材彪,一個(gè)是警告信息

當(dāng)然观挎,利用“不能除以0”的性質(zhì)也可以實(shí)現(xiàn)靜態(tài)斷言,但效果明顯沒有C++11標(biāo)準(zhǔn)中的好(畢竟標(biāo)準(zhǔn)直接報(bào)錯(cuò)警告信息段化,而這樣實(shí)現(xiàn)只會報(bào)不能/0嘁捷,這樣還會增加調(diào)試難度)

#include<iostream>
#include<cstring>
using namespace std;

#define assert_static(e) \
  do{ \
     enum{ assert_static__ = 1/ (e) }; \
  }while (0)
  
template <typename T, typename U> int bit_copy(T&a, U& b){
  assert_static(sizeof(b) == sizeof(a));
}
  
int main(){
  int a = 1;
  double b = 3;
  bit_copy(a,b);
}

noexcept修飾符與noexcept操作符

noexcept比throw()在效率上會高一些,在 C++11中显熏,noexcept替代了throw()

noexcept修飾符

noexcept修飾符有兩種形式雄嚣,一種是直接加上關(guān)鍵字noexcept,而另外一種則可以接受一個(gè)常量表達(dá)式作為參數(shù)
void excpt_func() noexcept (常量表達(dá)式);
量表達(dá)式的結(jié)果會被轉(zhuǎn)換成一個(gè)bool類型的值喘蟆。該值為true缓升,表示函數(shù)不會拋出異常,反之蕴轨,則有可能拋出異常港谊。這里,不帶常量表達(dá)式的noexcept相當(dāng)于聲明了noexcept(true)尺棋,即不會拋出異常封锉。
在通常情況下,在C++11中使用noexcept可以有效地阻止異常的傳播與擴(kuò)散膘螟。

noexcept操作符

noexcept作為一個(gè)操作符時(shí)成福,通常可以用于模板荆残。
我的測試代碼:

#include<iostream>
#include<cstring>
using namespace std;

class Test{
public:
  Test() {
    throw 1;
    cout<<"constructor"<<endl;
  }
  ~Test() {
    cout<<"dtor"<<endl; 
  }
};

template <class T>
  void fun() noexcept(noexcept(T())) {
    throw 1;
  }
  
int main(){
  try{
    fun<Test>(); 
  }
  catch(...){
    cout<<"caught"<<endl;  //caught
  }
  
  try{
    fun<int>(); 
  }
  catch(...){
    cout<<"caught"<<endl;  //terminate called after throwing an instance of 'int'
  }
  return 0;
}    

noexcept(noexcept(T()))中奴艾,第二個(gè)noexcept就是一個(gè)noexcept操作符。當(dāng)其參數(shù)是一個(gè)有可能拋出異常的表達(dá)式的時(shí)候内斯,其返回值為false蕴潦,反之為true(實(shí)際noexcept參數(shù)返回false還包括一些情況,這里就不展開講了)俘闯。
對于測試代碼中的例子潭苞,當(dāng)模板實(shí)參為Test時(shí),Test()可能拋出異常真朗,所以這時(shí)候此時(shí)簽名修飾符為noexcept(false)此疹,所以可以拋出異常
而當(dāng)模板實(shí)參為int的時(shí)候,noexcept(noexcept(T()))為noexcept(true)遮婶,所以這時(shí)候試圖拋出異常的話蝗碎,會直接調(diào)用std::terminate終端程序的執(zhí)行

另外需要注意的是,析構(gòu)函數(shù)默認(rèn)為noexcept旗扑,delete函數(shù)默認(rèn)為noexcept

快速初始化成員變量

C++11增加允許了使用=或者花括號{}的方式來初始化:
struct init{ int a = 1; double b {1.2}; };
這樣的方式也叫就地初始化蹦骑,然而有一個(gè)問題,這樣的初始化方式與初始化列表是否沖突臀防?
當(dāng)然不會沖突:

class Test{
public:
  Test(string ss = "234"):s(ss){}
  
  string s {"123"};
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眠菇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子清钥,更是在濱河造成了極大的恐慌琼锋,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟昭,死亡現(xiàn)場離奇詭異缕坎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)篡悟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門谜叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搬葬,你說我怎么就攤上這事荷腊。” “怎么了急凰?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵女仰,是天一觀的道長。 經(jīng)常有香客問我,道長疾忍,這世上最難降的妖魔是什么乔外? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮一罩,結(jié)果婚禮上杨幼,老公的妹妹穿的比我還像新娘。我一直安慰自己聂渊,他們只是感情好差购,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汉嗽,像睡著了一般欲逃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饼暑,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天暖夭,我揣著相機(jī)與錄音,去河邊找鬼撵孤。 笑死迈着,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邪码。 我是一名探鬼主播裕菠,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闭专!你這毒婦竟也來了奴潘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤影钉,失蹤者是張志新(化名)和其女友劉穎画髓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體平委,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奈虾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了廉赔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉微。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜡塌,靈堂內(nèi)的尸體忽然破棺而出碉纳,到底是詐尸還是另有隱情,我是刑警寧澤馏艾,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布劳曹,位于F島的核電站奴愉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铁孵。R本人自食惡果不足惜躁劣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望库菲。 院中可真熱鬧,春花似錦志膀、人聲如沸熙宇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烫止。三九已至,卻和暖如春戳稽,著一層夾襖步出監(jiān)牢的瞬間馆蠕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工惊奇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留互躬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓颂郎,卻偏偏與公主長得像吼渡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子乓序,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容