第一周筆記 - 第二章和第三章

使用初始化列表初始化內(nèi)置類型的時(shí)候骏掀,編譯器會(huì)做更加嚴(yán)格的檢查。

按書上的說(shuō)法jk都會(huì)有編譯錯(cuò)誤卸夕。而i可能不會(huì)有編譯錯(cuò)誤层释,雖然現(xiàn)在大多數(shù)的編譯器在i的時(shí)候都會(huì)報(bào)錯(cuò)。所以個(gè)人覺得對(duì)于內(nèi)置類型也使用初始化列表來(lái)初始化不是個(gè)強(qiáng)制要求娇哆,因?yàn)榇a看起來(lái)不舒服,還要多打幾個(gè)字母。

    int i = 1.1;
    int j{ 1.1 };
    int k = { 1.1 };

任何顯式的初始化都會(huì)把聲明變成定義碍讨。

extern int g_i = 0;這是個(gè)定義治力。

聲明其實(shí)也可以寫在函數(shù)內(nèi)。

比如在調(diào)試程序的時(shí)候勃黍,我喜歡寫下面這樣的代碼宵统。目的在于懶得跳到函數(shù)的最前面寫上extern int g_i,跳來(lái)跳去麻煩覆获,回頭要?jiǎng)h除代碼的時(shí)候马澈,也要?jiǎng)h兩處。而直接在用的地方這么寫就方便多了弄息。當(dāng)然在正式的產(chǎn)品代碼中痊班,不推薦這么寫。

int foo(){
    extern int g_i;
    g_i = 10;
}

P33 如何表示類型的最大最小值摹量。

如果想知道各個(gè)類型的最大最小值涤伐,在C下應(yīng)該查看三個(gè)頭文件:limits.hfloat.h缨称,stdint.h凝果。其中規(guī)定了諸如INT_MAXULONG_MAX的宏睦尽。
在C語(yǔ)言出生的那個(gè)年代器净,處理器各種各樣,為了保證C語(yǔ)言的可移植性当凡,C語(yǔ)言的標(biāo)準(zhǔn)甚至連char bit都是用宏來(lái)定義的山害。

define CHAR_BIT 8 /* number of bits in a char */

在C++語(yǔ)言下使用頭文件limits(沒(méi)有.h的版本)里面的std::numeric_limits

std::numeric_limits<int>::lowest()
std::numeric_limits<int>::max()

不太熟悉和用的不多的C++關(guān)鍵字 P43

  • alignas
  • alignof
  • noexcept
  • constexpr
  • thread_local

操作符替代名 P43

其實(shí)挺喜歡用not代替!宁玫,因?yàn)?code>!有時(shí)候太小了粗恢,常常忘記沒(méi)看到。用not就可讀多了欧瘪,不過(guò)似乎沒(méi)人這么用眷射,那就算了吧。

#include <iso646.h>
int foo(int *p){
    if (!p){}

    if (not p){}
}

內(nèi)置類 P45

沒(méi)聽過(guò)這個(gè)詞佛掖,

constexpr

這個(gè)東西后面的章節(jié)還要提妖碉,暫時(shí)這里就不去深究了。constexpr指的是一種在編譯階段就能計(jì)算出值的表達(dá)式芥被,在某些特定場(chǎng)合欧宜,比如說(shuō)聲明數(shù)組的時(shí)候,都必須使用編譯期常量拴魄,因?yàn)榫幾g器必須知道數(shù)組的長(zhǎng)度冗茸。比如說(shuō)下面的代碼是可行的席镀。

const int a = 10;
int b[a + 20] = { 0 };

但是在C++03的時(shí)代,一個(gè)常量是否被當(dāng)成編譯期常量完全是編譯器自己憑感覺夏漱。比如說(shuō)下面size()明顯就是個(gè)常量豪诲,但是編譯器并不會(huì)把它當(dāng)成一個(gè)常量。

int size(){ return 10; }
int c[size()] = { 0 }; //error here

所以直覺上c++11引入這個(gè)新的東西的目的就是告訴編譯器這里需要一個(gè)編譯期常量挂绰,請(qǐng)?jiān)噲D去計(jì)算這個(gè)表達(dá)式屎篱。比如說(shuō)下面這段代碼是正確的,編譯器是會(huì)在編譯階段來(lái)計(jì)算sum(10)的值葵蒂。PS: VS2013還沒(méi)有很好的支持constexpr交播,所以要嘗試下面的代碼,可以試試GCC或者Clang

constexpr int sum(int n) {
    return n <= 1 ? 1 : n + sum(n - 1); 
};
int d[sum(10)] = { 0 };

constexpr指針

如果嚴(yán)謹(jǐn)?shù)恼f(shuō)践付,consexpr不一定都是編譯期就能及計(jì)算出來(lái)的值秦士,比如說(shuō)constexpr指針。從下面這段代碼為例荔仁,p1的值必須等到運(yùn)行階段才能知道伍宦,所以p2 - p1就不可能是一個(gè)constexpr

//global
int i, j;
constexpr int * p1 = &i;
constexpr int * p2 = &j;
constexpr int c1 = p2 - p1; // wrong here

某些情況下編譯器也能比較聰明的處理下面這種情況。

int a[10];
constexpr int *p = &a[1];
constexpr int *pp = &a[5];
constexpr int c = pp - p; // correct

類型別名 P60

初略的查了一下資料乏梁,using和typedef是等價(jià)的次洼,所以應(yīng)該用using來(lái)替代掉typedef。主要目的是可讀性比較好遇骑。

指針卖毁,常量和類型別名 P61

書上提到了把pstring展開后來(lái)理解類型是不對(duì)的,cstrcstr1其實(shí)是不一樣的類型落萎。

typedef char* pstring;
const pstring cstr = 0; // cstr is const pointer to char type
const char* cstr2 = 0; // cstr2 is pointer to const char type

這里想了個(gè)小技巧亥啦,沒(méi)有特別細(xì)究,但估計(jì)是正確的方法练链。當(dāng)遇到const T的情況翔脱,把前置的const寫到類型后面,如T const媒鼓。這樣在做展開就沒(méi)錯(cuò)了届吁。

pstring const cstr = 0; // const pointer to char type;
char * const cstr2 = 0; // const pointer to char type;

當(dāng)把const放到后面以后,解讀類型就可以方便的從右到左的讀出來(lái)绿鸣。
&替換成reference to疚沐,把*替換成pointer to;那就是很自然的話了潮模。

char *p;
char const * const & k = p; // K is reference to const pointer to const char;

top-level const和low-level const

如果把const放到了類型的右邊亮蛔,那么top-level const就是直接靠近變量的標(biāo)識(shí)符的const,這個(gè)const限制的是變量本身不能改變擎厢。為什么會(huì)用top-level和low-level這兩個(gè)詞呢究流,估計(jì)是從編譯原理里面的語(yǔ)法樹分析借鑒來(lái)的辣吃。

auto關(guān)鍵字。

auto關(guān)鍵字有兩個(gè)特點(diǎn)芬探,頂層的引用屬性和const屬性會(huì)被去掉齿尽。

const int ci = 10;
const int &r = 10;
auto a = &ci;
const auto &b = r;

&c的類型是int const *,所以沒(méi)有top-level const灯节。那么a的類型就是int const *
&r的類型是int const &,去掉頂層的引用變成int const绵估,那么b的類型就是(int const) const & b; 兩個(gè)const都修飾左邊的int炎疆。也就是int const & b

decltype就沒(méi)有講透,需要進(jìn)一步的細(xì)化国裳。

這個(gè)東西在寫模板的時(shí)候很有用處形入,所以需要仔細(xì)的了解。

關(guān)于表達(dá)式i=10的類型

在練習(xí)2.37 P64也提到了i=x的類型是int&缝左,所以下面這段代碼是可行的亿遂。但只是在C++下可行,在C下是不可行的渺杉。

int i, *p;
(i = 10) = 20;
p = &(i = 1);

當(dāng)使用字符串初始化std::string時(shí)蛇数,如果字符串中間包含了'\0'字符,如何繞過(guò)去是越。

如例子s2耳舅,可以使用另外一個(gè)構(gòu)造函數(shù)Constructs the string with the contents of the range [first, last).

int main(){
    char s[] = "first\0second";
    string s1(s); // only get "first "
    cout << s1.length() << " : " << s1 << endl;
    string s2(s, s + sizeof(s));
    cout << s2.length() << " : " << s2 << endl;
}

輸出是

5 : first
13 : first second

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倚评,隨后出現(xiàn)的幾起案子浦徊,更是在濱河造成了極大的恐慌,老刑警劉巖天梧,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盔性,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡呢岗,警方通過(guò)查閱死者的電腦和手機(jī)冕香,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敷燎,“玉大人暂筝,你說(shuō)我怎么就攤上這事∮补幔” “怎么了焕襟?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饭豹。 經(jīng)常有香客問(wèn)我鸵赖,道長(zhǎng)务漩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任它褪,我火速辦了婚禮饵骨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茫打。我一直安慰自己居触,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布老赤。 她就那樣靜靜地躺著轮洋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抬旺。 梳的紋絲不亂的頭發(fā)上弊予,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音开财,去河邊找鬼汉柒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛责鳍,可吹牛的內(nèi)容都是我干的碾褂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼历葛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斋扰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啃洋,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤传货,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宏娄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體问裕,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年孵坚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粮宛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卖宠,死狀恐怖巍杈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扛伍,我是刑警寧澤筷畦,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響鳖宾,放射性物質(zhì)發(fā)生泄漏吼砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一鼎文、第九天 我趴在偏房一處隱蔽的房頂上張望渔肩。 院中可真熱鬧,春花似錦拇惋、人聲如沸周偎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栏饮。三九已至,卻和暖如春磷仰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背境蔼。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工灶平, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箍土。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓逢享,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吴藻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞒爬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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

  • 基本內(nèi)置類型 算術(shù)類型字符整型布爾值浮點(diǎn)數(shù) 空類型(void) 算術(shù)類型 帶符號(hào)類型和無(wú)符號(hào)類型int侧但、short...
    2625K閱讀 3,181評(píng)論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評(píng)論 1 51
  • C++入門基礎(chǔ) namespace專題講座 namespace概念 所謂namespace,是指標(biāo)識(shí)符的各種可見范...
    蔡俊宇閱讀 789評(píng)論 0 2
  • 接著上節(jié) condition_varible 航罗,本節(jié)主要介紹future的內(nèi)容禀横,練習(xí)代碼地址。本文參考http:/...
    jorion閱讀 14,791評(píng)論 1 5
  • 聽南拳媽媽的歌時(shí)候似乎自己已不是那么年少粥血,但對(duì)“到不了的地方叫遠(yuǎn)方柏锄、回不去的是故鄉(xiāng)已初有懵懂的體會(huì)。 生在赤火西南...
    晴照生閱讀 503評(píng)論 2 1