《C++ Primer》讀書(shū)筆記

前言

《C++ Primer》讀薄系列筆記全集。

目錄

第I部分:C++基礎(chǔ)

  1. 開(kāi)始學(xué)習(xí)C++
  2. 變量和基本類(lèi)型
  3. 字符串毯盈、向量和數(shù)組
  4. 表達(dá)式
  5. 語(yǔ)句
  6. 函數(shù)
  7. 類(lèi)

第II部分:C++標(biāo)準(zhǔn)庫(kù)

  1. IO庫(kù)
  2. 順序容器
  3. 范型算法
  4. 關(guān)聯(lián)容器
  5. 動(dòng)態(tài)內(nèi)存

第III部分:類(lèi)設(shè)計(jì)者的工具

  1. 拷貝控制
  2. 重載運(yùn)算與類(lèi)型轉(zhuǎn)換
  3. 面向?qū)ο蟪绦蛟O(shè)計(jì)
  4. 模版與泛型編程

題解

修訂版課后題解見(jiàn)GitHub倉(cāng)庫(kù):cpp-primer-workbook剃毒。

開(kāi)始學(xué)習(xí)C++

  1. main的返回值:0為成功狀態(tài),非0為系統(tǒng)定義的錯(cuò)誤類(lèi)型
  2. 輸入輸出:計(jì)算結(jié)果為左側(cè)運(yùn)算對(duì)象搂赋,IO操作讀寫(xiě)緩沖與程序中的動(dòng)作無(wú)關(guān)
  3. 輸入流istream對(duì)象:cin(標(biāo)準(zhǔn)輸入)赘阀;流狀態(tài)有效則cin為真,遇到EOF或無(wú)效輸入cin為假
  4. 鍵盤(pán)輸入EOF:Windows下ctrl+d->return脑奠,Unix下ctrl+d
  5. 輸出流ostream對(duì)象:cout(標(biāo)準(zhǔn)輸出)基公、cerr(警告錯(cuò)誤、不緩沖)宋欺、clog(一般性信息轰豆、緩沖)
  6. 操縱符endl:結(jié)束當(dāng)前行,并將緩沖區(qū)內(nèi)容刷到設(shè)備中齿诞,調(diào)試時(shí)的打印應(yīng)保證一直刷新流
  7. 緩沖刷新:默認(rèn)情況下酸休,cin和cerr會(huì)刷cout緩沖,程序異常終止cout不會(huì)被刷新
  8. 命名空間:避免相同名字導(dǎo)致的沖突祷杈,調(diào)用標(biāo)準(zhǔn)庫(kù)需顯式說(shuō)明作用域std::
  9. 文件重定向:將標(biāo)準(zhǔn)輸入輸出與文件關(guān)聯(lián)斑司,運(yùn)行命令 prog1 <infile >outfile
  10. 編譯:
編譯器 系統(tǒng)環(huán)境 編譯 運(yùn)行 獲取返回值
VS Windows c1 /EHsc /W4 prog1.cc prog1 echo %ERRORLEVEL%
GNU Unix g++ -std=c++11 -Wall prog1.cc ./a.out echo $?

變量和基本類(lèi)型

  1. 空類(lèi)型(void):無(wú)值無(wú)操作,不能定義void類(lèi)型變量
  2. 字符類(lèi)型:char為UTF-8編碼但汞,wchar_t是確保機(jī)器可以存儲(chǔ)及其最大擴(kuò)展字符集中的任何字符的寬字符陡厘,char16_t和char32_t對(duì)應(yīng)Unicode字符集
  3. 內(nèi)置類(lèi)型的機(jī)器實(shí)現(xiàn):地址表示比特串開(kāi)始位置,類(lèi)型決定了數(shù)據(jù)所占的比特位數(shù)及如何解釋其內(nèi)容
  4. 浮點(diǎn)數(shù):float和double分別有7和16個(gè)有效位特占,通常選用double,避免float的低精度及l(fā)ong double的低效率
  5. 未定義(undefined):引發(fā)難以追蹤的運(yùn)行時(shí)的錯(cuò)誤云茸、安全問(wèn)題是目、移植性問(wèn)題
  6. 賦值超范圍:對(duì)無(wú)符號(hào)類(lèi)型是初始值對(duì)無(wú)符號(hào)類(lèi)型表示數(shù)值范圍取模后的余數(shù),而帶符號(hào)類(lèi)型結(jié)果是未定義
  7. 有無(wú)符號(hào)類(lèi)型混用:表達(dá)式中同時(shí)包含帶符號(hào)和無(wú)符號(hào)類(lèi)型标捺,帶符號(hào)數(shù)會(huì)自動(dòng)轉(zhuǎn)為無(wú)符號(hào)數(shù)
  8. 整型字面值:十進(jìn)制字面值默認(rèn)為帶符號(hào)數(shù)懊纳,是int/long/long long 中能容納其值且尺寸最小。八進(jìn)制(0開(kāi)頭)和十六進(jìn)制(0x開(kāi)頭)則是int/unsigned int/unsigned long/long long/unsigned long long中尺寸最小者
  9. 浮點(diǎn)型字面值:小數(shù)或科學(xué)計(jì)數(shù)法形式的指數(shù)亡容,默認(rèn)類(lèi)型double
  10. 字符串字面值:編譯器在每個(gè)字符串結(jié)尾添加空字符'\0’
  11. 字符前綴與類(lèi)型:u(char16_t)嗤疯,U(char32_t),L(wchar_t)闺兢,u8(char)
  12. 泛化的轉(zhuǎn)義序列:\x后跟十六進(jìn)制數(shù)字茂缚,或\后跟1到3位八進(jìn)制數(shù)字,可像普通字符一樣使用
  13. 列表初始化:使用花括號(hào)初始化,當(dāng)存在丟失信息風(fēng)險(xiǎn)時(shí)編譯器將報(bào)錯(cuò)脚囊,而使用()可以執(zhí)行但可能發(fā)生信息丟失
  14. 初始化:定義在任何函數(shù)之外的變量被初始化為0龟糕,每個(gè)類(lèi)決定各自的初始化對(duì)象方式。而定義在函數(shù)體內(nèi)部的內(nèi)置變量類(lèi)型將不初始化悔耘,試圖訪(fǎng)問(wèn)未初始化的值將引發(fā)未定義行為
  15. 定義:負(fù)責(zé)創(chuàng)建與名字關(guān)聯(lián)的實(shí)體讲岁,并申請(qǐng)存儲(chǔ)空間和賦初始值
  16. 聲明:規(guī)定變量的類(lèi)型和名字,只聲明不定義可在變量名前添加extern并不顯式初始化衬以,包含顯式初始化即為定義
  17. 引用:為對(duì)象起的別名缓艳,定義時(shí)必須初始化,不是對(duì)象看峻,不可定義引用的引用
  18. 指針:指向某個(gè)對(duì)象阶淘,定義時(shí)無(wú)需賦值,本身就是對(duì)象备籽,對(duì)指針使用解引用符*可訪(fǎng)問(wèn)該對(duì)象
  19. 指針值狀態(tài):指向一個(gè)對(duì)象舶治、指向?qū)ο蟮南乱粋€(gè)緊鄰空間位置、空指針车猬、無(wú)效指針(訪(fǎng)問(wèn)或拷貝都會(huì)出錯(cuò))
  20. 空指針(nullptr):不指向任何對(duì)象霉猛,可以轉(zhuǎn)換成任何其他的指針類(lèi)型
  21. 初始化指針:建議用已定義對(duì)象或nullptr或0初始化所有指針,把任何int型變量(即使值為0)賦值給指針是錯(cuò)誤的
  22. void*指針:可存放任意對(duì)象的地址珠闰,但不能直接操作其所指對(duì)象
  23. 引用/指針類(lèi)型匹配:除兩種特例(const可綁定非const惜浅,基類(lèi)可綁定派生類(lèi))外,指針和引用的類(lèi)型都需要與之綁定的對(duì)象嚴(yán)格匹配
  24. 復(fù)合類(lèi)型判斷:從右向左閱讀復(fù)雜的指針或引用的聲明語(yǔ)句伏嗜,離變量名越近的符號(hào)對(duì)變量的類(lèi)型有越直接的影響
  25. 多文件共享const:不管聲明還是定義都要添加關(guān)鍵字extern
  26. 初始化對(duì)const的引用:允許任何表達(dá)式作為初始值坛悉,只要該表達(dá)式結(jié)果可以轉(zhuǎn)化為引用類(lèi)型的臨時(shí)量對(duì)象
  27. 指向常量的指針:自覺(jué)不去改變所指對(duì)象的值,而該對(duì)象若不是常量對(duì)象則其值通過(guò)其他方式改變
  28. const指針:必須初始化且不能修改承绸,書(shū)寫(xiě)上直接在變量名之前裸影,表示不變的是指針本身而非指針指向的對(duì)象
  29. 頂層/底層const:頂層const表示本身是常量,底層const表示綁定的對(duì)象是常量军熏;執(zhí)行拷貝操作時(shí)轩猩,拷入拷出對(duì)象必須具有相同的底層const資格,或能夠強(qiáng)制轉(zhuǎn)換
  30. 常量表達(dá)式:數(shù)據(jù)類(lèi)型和初始值都需要是常量類(lèi)型荡澎,值不會(huì)改變并在編譯過(guò)程就能得到計(jì)算結(jié)果
  31. constexpr變量:一定是常量均践,必須用常量表達(dá)式(字面值類(lèi)型,包括算術(shù)類(lèi)型摩幔、引用彤委、指針)或constexpr函數(shù)(足夠簡(jiǎn)單編譯時(shí)可計(jì)算結(jié)果)初始化
  32. constexpr指針:初始值是nullptr或0,或存儲(chǔ)于某個(gè)固定地址中的對(duì)象
  33. 指針或衡、常量與類(lèi)型別名:typedef char *pstring; const pstring cstr = 0;焦影,與const char *cstr不等價(jià)车遂,前者的cstr是指向char的常量指針,后者中cstr是指向常量char的指針
  34. 類(lèi)型說(shuō)明符auto:讓編譯器通過(guò)初始值推算變量類(lèi)型偷办,并賦諸該值艰额;忽略頂層const,保留底層const
  35. 類(lèi)型指示符decltype:讓編譯器通過(guò)初始值推算變量類(lèi)型椒涯,但不用該初始值賦值柄沮;包含頂層const,解引用废岂、(())祖搓、賦值產(chǎn)生的引用都會(huì)判為引用類(lèi)型
  36. 預(yù)處理器:在編譯前執(zhí)行的一段程序,功能有替換#include的頭文件,以及頭文件保護(hù)符避免重復(fù)定義實(shí)體
  37. 預(yù)處理變量:#define將一個(gè)名字設(shè)置為預(yù)處理變量,#ifndef及#ifdef則判斷名字是否已被定義過(guò)霸妹,無(wú)視作用域規(guī)則

字符串窍帝、向量和數(shù)組

  1. using聲明:每個(gè)using聲明引入命名空間的一個(gè)成員棍掐;頭文件中的代碼一般不應(yīng)使用using聲明
  2. string初始化:用數(shù)字和字符初始化,則string對(duì)象內(nèi)容是將給定字符連續(xù)重復(fù)給定次數(shù)得到的序列
  3. getline:從輸入流中讀入內(nèi)容直到讀入換行符,保留空白符,但換行符不存入string對(duì)象中
  4. 字面值與string:字符字面值和字符串字面值可以轉(zhuǎn)化為string對(duì)象该贾,相加時(shí)加號(hào)兩側(cè)的運(yùn)算對(duì)象至少有一個(gè)是string型
  5. C++版的C頭文件:C++版本的C標(biāo)準(zhǔn)庫(kù)頭文件中,定義的名字從屬于命名空間std捌臊,對(duì)應(yīng)的C語(yǔ)言的.h文件則不然
  6. size_type:string::size_type和vector::size_type可表示各自類(lèi)型的長(zhǎng)度或下標(biāo)杨蛋,無(wú)符號(hào)整數(shù)
  7. 實(shí)例化:根據(jù)模版創(chuàng)建類(lèi)或函數(shù)的過(guò)程,必須指明實(shí)例化成何種類(lèi)型
  8. 初始化特例:拷貝初始化時(shí)只能提供一個(gè)初始值理澎;類(lèi)內(nèi)初始值只能使用拷貝初始化或花括號(hào)逞力;初始元素值的列表只能放在花括號(hào)內(nèi)
  9. 值初始化:通常使用圓括號(hào);但如果使用花括號(hào)但提供的值又不能用來(lái)列表初始化時(shí)糠爬,編譯器也會(huì)嘗試用值初始化
  10. vector比較:當(dāng)元素的值可比較時(shí)寇荧,按照字典順序進(jìn)行
  11. 下標(biāo)運(yùn)算符:vector或string的下標(biāo)運(yùn)算符可用于訪(fǎng)問(wèn)已存在的元素,而不能用于添加元素
  12. 迭代器成員:begin和end運(yùn)算符的具體類(lèi)型由對(duì)象是否是常量決定执隧,cbegin和cend始終得到const_iterator
  13. 迭代器比較:兩個(gè)迭代器砚亭,指向同一容器中的元素或尾元素的下一位置,比較的是位置的前后殴玛;相減得到different_type型的有符號(hào)整數(shù),表示兩個(gè)迭代器的距離
  14. 定義數(shù)組:必須指定數(shù)組類(lèi)型添祸,不能使用auto由初始值推斷滚粟;類(lèi)型不能是引用
  15. 字符數(shù)組:可以使用字符串字面型初始化,數(shù)組中需要空間放空字符
  16. 復(fù)雜數(shù)組聲明:從數(shù)組名字開(kāi)始按照由內(nèi)向外的順序閱讀刃泌,如int *(&a)[10]表示a是對(duì)數(shù)組引用凡壤,該數(shù)組包含10個(gè)int*
  17. 數(shù)組下標(biāo):通常定義為無(wú)符號(hào)類(lèi)size_t類(lèi)型署尤,但與標(biāo)準(zhǔn)哭類(lèi)型不同的是,數(shù)組允許負(fù)數(shù)作為下標(biāo)
  18. 數(shù)組與指針:多數(shù)表達(dá)式中亚侠,使用數(shù)組類(lèi)型的對(duì)象其實(shí)是使用一個(gè)指向該數(shù)組首元素的指針
  19. 首指針和尾后指針:使用標(biāo)準(zhǔn)庫(kù)函數(shù)begin()和end()可以得到數(shù)組的首指針和尾后指針曹体;提供這兩個(gè)指針可以將數(shù)組拷貝初始化vector對(duì)象;尾后指針不指向具體元素硝烂,不能解引用或遞增
  20. 指針比較:只要兩個(gè)指針指向同一個(gè)數(shù)組的元素或尾元素下一個(gè)位置箕别,就能用關(guān)系運(yùn)算符比較前后;兩個(gè)指針相減的結(jié)果類(lèi)型是有符號(hào)類(lèi)型ptrdiff_t
  21. string轉(zhuǎn)char*:s.c_str()函數(shù)將string對(duì)象s滞谢,轉(zhuǎn)化為一個(gè)C風(fēng)格的字符串串稀,但無(wú)法避免s改變后之前返回的字符串失去效用
  22. 多維數(shù)組初始化:使用花括號(hào)的形式,未列出的元素執(zhí)行默認(rèn)值初始化
  23. 范圍for處理多維數(shù)組:除最內(nèi)層循環(huán)外狮杨,其他所有循環(huán)的控制變量都應(yīng)該是引用類(lèi)型母截,以避免這些數(shù)組形式的元素被自動(dòng)轉(zhuǎn)換成指向數(shù)組首元素的指針
  24. 多維數(shù)組指針:多維數(shù)組的指針是指向內(nèi)層數(shù)組的指針;避免指針類(lèi)型混淆可使用auto或decltype橄教,begin()和end()清寇,類(lèi)型別名簡(jiǎn)化多維數(shù)組的指針

表達(dá)式

  1. 左值右值:左值用的是對(duì)象的身份,右值用的是對(duì)象的值
  2. 求值順序:未指定執(zhí)行順序的表達(dá)式护蝶,如果指向并修改同一個(gè)對(duì)象华烟,會(huì)引發(fā)錯(cuò)誤產(chǎn)生未定義;只有4種運(yùn)算符規(guī)定了從左到右的求值順序(條件與&&滓走、條件或||垦江、條件運(yùn)算符?:、逗號(hào),
  3. 整數(shù)相除:商向0取整搅方;取余時(shí)m%(-n)=m%(n)比吭,-m%n=-(m%n)
  4. 真值測(cè)試:比較運(yùn)算中除非比較對(duì)象是bool型,否則不使用布爾字面值
  5. 值初始化:無(wú)論左側(cè)運(yùn)算對(duì)象是什么類(lèi)型姨涡,初始值列表都可以為空衩藤,編譯器會(huì)創(chuàng)建值初始化的臨時(shí)量賦給左側(cè)運(yùn)算對(duì)象
  6. 復(fù)合賦值運(yùn)算符:只求值1次,普通運(yùn)算符需要2次(右邊表達(dá)式和賦值)
  7. 整型提升:小整型(如short涛漂、char)總會(huì)自動(dòng)提升為較大的整型赏表,一般為int;較大的char(如w_char)提升為大整型中可容納原值的最小一類(lèi)
  8. 移位運(yùn)算符:右側(cè)的移動(dòng)位數(shù)必須非負(fù)且小于結(jié)果的位數(shù)匈仗;移出位被舍棄瓢剿,符號(hào)位視機(jī)器而定
  9. sizeof運(yùn)算符:可使用作用域來(lái)獲取類(lèi)成員大小,可使用無(wú)效的指針獲取指針指向的對(duì)象所占空間悠轩,不會(huì)把數(shù)組當(dāng)指針處理间狂,對(duì)string或vector返回固定部分的大小火架;sizeof的返回值是常量表達(dá)式
  10. 逗號(hào)運(yùn)算符:先對(duì)左側(cè)表達(dá)式求值鉴象,然后丟棄求值結(jié)果忙菠,真正的結(jié)果是右側(cè)表達(dá)式的值
  11. 數(shù)組指針轉(zhuǎn)換:大多時(shí)候會(huì)自動(dòng)隱式轉(zhuǎn)換;當(dāng)數(shù)組被當(dāng)作decltype纺弊、&牛欢、sizeof、typeid的運(yùn)算對(duì)象時(shí)淆游,轉(zhuǎn)換不發(fā)生
  12. 指針的轉(zhuǎn)換:0或nullptr可轉(zhuǎn)換成任意指針類(lèi)型傍睹,非底層const的指針可以轉(zhuǎn)為void*,底層const的指針可以轉(zhuǎn)為const void*
  13. 命名的強(qiáng)制類(lèi)型轉(zhuǎn)換:static_cast(無(wú)底層const)稽犁、dynamic_cast(運(yùn)行時(shí)類(lèi)型識(shí)別)焰望、const_cast(有底層const)、reinterpret_cast(低層的重新解釋?zhuān)?/li>

語(yǔ)句

  1. switch語(yǔ)句:對(duì)括號(hào)內(nèi)表達(dá)式求值轉(zhuǎn)換為整數(shù)類(lèi)型已亥,然后與case后的每個(gè)常量表達(dá)式比較
  2. default標(biāo)簽:當(dāng)其他case都不滿(mǎn)足時(shí)執(zhí)行熊赖,位置自由,若為空也必須跟上一個(gè)空語(yǔ)句( ;)或空塊({})
  3. 控制流跳轉(zhuǎn):在switch和goto中虑椎,不允許跨過(guò)變量的初始化語(yǔ)句直接跳轉(zhuǎn)到該變量作用域內(nèi)的另一個(gè)位置
  4. 范圍for語(yǔ)句:語(yǔ)法形式是for (declaration: expression) statement震鹉;expression表示一個(gè)可以返回迭代器的begin()和end()的序列,不允許增刪容器元素改變范圍for中預(yù)存的end()值
  5. 異常:throw引發(fā)異常捆姜,try中跑出的異常通過(guò)會(huì)被某個(gè)catch處理传趾,在throw與catch間通過(guò)異常類(lèi)傳遞信息
  6. 尋找異常處理代碼:尋找異常處理代碼的過(guò)程與函數(shù)調(diào)用相反,逐層回退直到找到適當(dāng)類(lèi)型的catch子句泥技;若最終未找到則會(huì)轉(zhuǎn)到terminate的標(biāo)準(zhǔn)庫(kù)函數(shù)浆兰,全無(wú)try語(yǔ)句的程序會(huì)直接調(diào)用terminate
  7. 異常安全:確保對(duì)象有效,資源無(wú)泄漏珊豹,程序處于合理狀態(tài)簸呈,等等
  8. 異常類(lèi):頭文件exception中的exception類(lèi)、stdexcept中定義了幾種常見(jiàn)的異常類(lèi)店茶、new中的bad_alloc蜕便、type_info中的bad_cast
  9. 異常類(lèi)初始化:exception、bad_alloc贩幻、bad_cast只允許默認(rèn)初始化轿腺,what()返回編譯器決定的異常信息;標(biāo)準(zhǔn)異常類(lèi)必須使用string或C風(fēng)格字符串初始化丛楚,what()返回該串

函數(shù)

  1. 函數(shù)參數(shù):實(shí)參是函數(shù)中形參的初始值族壳,存在對(duì)應(yīng)關(guān)系,但并沒(méi)有規(guī)定實(shí)參的求值順序
  2. 局部靜態(tài)對(duì)象:不同于只存在于塊執(zhí)行期間的自動(dòng)對(duì)象趣些,局部靜態(tài)對(duì)象直到程序終止才被銷(xiāo)毀仿荆;沒(méi)有顯式初始值時(shí)會(huì)執(zhí)行值初始化
  3. 函數(shù)聲明:函數(shù)可以只能聲明一次,但可以定義多次,如果一個(gè)函數(shù)永遠(yuǎn)不會(huì)被用到赖歌,可以只聲明不定義
  4. const參數(shù):實(shí)參初始化形參時(shí)會(huì)忽略頂層const,所以有無(wú)頂層const版本等價(jià)功茴,都定義則屬于重復(fù)定義
  5. 數(shù)組實(shí)參:不允許拷貝數(shù)組庐冯,傳遞數(shù)組時(shí)實(shí)際上是傳遞指向首元素的指針;不同大小的數(shù)組是不同類(lèi)型坎穿;若形參是引用展父,數(shù)組不會(huì)轉(zhuǎn)換為指針
  6. 傳多維數(shù)組:數(shù)組第二維(以及后面所有維度)的大小都是數(shù)組類(lèi)型的一部分,不能省略
  7. initializer_list:實(shí)參數(shù)量未知但類(lèi)型都相同玲昧,initializer_list可作形參栖茉;提供的操作類(lèi)似容器,但對(duì)象中的元素永遠(yuǎn)是常量
  8. 省略符形參:出現(xiàn)在形參列表的最后一個(gè)位置孵延,形式為f(…)f(t,…)吕漂;大多類(lèi)類(lèi)型對(duì)象傳遞給省略符形參時(shí)無(wú)法正常拷貝
  9. 返回引用:不要返回局部對(duì)象的引用或指針尘应,調(diào)用一個(gè)返回引用的函數(shù)得到左值
  10. 列表初始化返回值:函數(shù)可以返回花括號(hào)包圍的值的列表惶凝;若返回為內(nèi)置類(lèi)型,則花括號(hào)內(nèi)至多一個(gè)值犬钢,而且所占空間不應(yīng)大于目標(biāo)類(lèi)型空間
  11. main的返回值:控制到了main的結(jié)尾仍無(wú)return語(yǔ)句苍鲜,編譯器隱式插入return 0;;頭文件cstdlib中定義了預(yù)處理變量EXIT_FAILURE和EXIT_SUCCESS表示成敗
  12. 返回?cái)?shù)組指針:形如Type (*function(parameter_list))[dimension]玷犹,函數(shù)返回類(lèi)型是指向大小為dimension的數(shù)組的指針
  13. 尾置返回類(lèi)型:形如auto function(parameter_list) -> Type (*)[dimension];
  14. decltype確定返回類(lèi)型:把左值轉(zhuǎn)換為引用混滔;由于decltype不負(fù)責(zé)把數(shù)組或函數(shù)類(lèi)型轉(zhuǎn)換為對(duì)應(yīng)指針,所以函數(shù)聲明時(shí)要加一個(gè)星號(hào)
  15. main函數(shù):不能調(diào)用自己歹颓,不能重載
  16. const_cast和重載:常用const_cast修改const參數(shù)屬性的性質(zhì)坯屿,將const和非const版本的重載函數(shù)關(guān)聯(lián)
  17. 重載與作用域:名字查找發(fā)生在類(lèi)型檢查前,所以在不同作用域無(wú)法重載函數(shù)名晴股,且內(nèi)層將隱藏外層聲明的同名函數(shù)
  18. 形參默認(rèn)值:被賦予了默認(rèn)值的形參愿伴,后面所有形參都必須有默認(rèn)值;在給定的作用域中一個(gè)形參只能被賦予一次默認(rèn)值电湘;可多次聲明函數(shù)給不同形參賦予默認(rèn)值
  19. 內(nèi)聯(lián)函數(shù):一般只有當(dāng)函數(shù)規(guī)模小隔节、流程直接、無(wú)遞歸時(shí)寂呛,內(nèi)聯(lián)函數(shù)的請(qǐng)求才會(huì)被編譯器接受
  20. constexpr函數(shù):能用于常量表達(dá)式的函數(shù)怎诫,但返回值可以是非常量;返回和形參類(lèi)型都是字面值類(lèi)型贷痪,函數(shù)只執(zhí)行一句return幻妓;被隱式指定為內(nèi)聯(lián)函數(shù);
  21. 內(nèi)聯(lián)定義:和其他函數(shù)不同劫拢,內(nèi)聯(lián)和constexpr函數(shù)可以多次定義肉津,但每次必須完全一致强胰,通常定義在頭文件中
  22. 預(yù)處理宏assert:根據(jù)提供的表達(dá)式判斷是否要輸出錯(cuò)誤信息并終止程序,可定義預(yù)處理變量NDEBUG禁用assert的效果
  23. NDEBUG:可在#ifndef NDEBUG#endif之間編寫(xiě)自己的調(diào)試代碼妹沙;有5個(gè)編譯器預(yù)定義的名字變量__func__/__FILE__/__LINE__/__TIME__/__DATE__偶洋,用于輸出調(diào)試信息
  24. 函數(shù)匹配:先選擇在調(diào)用點(diǎn)可用的同名候選函數(shù),再找到參數(shù)數(shù)量相等且類(lèi)型相同或可強(qiáng)制轉(zhuǎn)換的可行函數(shù)距糖,再尋找其中最佳匹配的函數(shù)
  25. 最佳匹配:每個(gè)實(shí)參的匹配都不劣于其他可行函數(shù)玄窝,且至少有一個(gè)優(yōu)于其他;若找不到最佳匹配則報(bào)二義性錯(cuò)誤
  26. 實(shí)參類(lèi)型轉(zhuǎn)化優(yōu)先級(jí):精確匹配>const轉(zhuǎn)換>類(lèi)型提升>算術(shù)類(lèi)型或指針轉(zhuǎn)換>類(lèi)類(lèi)型轉(zhuǎn)換
  27. 函數(shù)指針:聲明指向一個(gè)函數(shù)的指針悍引,只需要用指針替換函數(shù)名恩脂;將函數(shù)名當(dāng)作值使用時(shí)會(huì)自動(dòng)轉(zhuǎn)換成指針
  28. 重載函數(shù)的指針:指針類(lèi)型必須與重載函數(shù)中的某一個(gè)精確匹配
  29. 函數(shù)指針形參:函數(shù)聲明中,若形參是函數(shù)類(lèi)型趣斤,則它會(huì)自動(dòng)轉(zhuǎn)換成指向函數(shù)的指針

類(lèi)

  1. 數(shù)據(jù)抽象:定義數(shù)據(jù)成員和函數(shù)成員俩块,抽象數(shù)據(jù)類(lèi)型依賴(lài)封裝
  2. 封裝:分離接口(用戶(hù)所能執(zhí)行的操作)和實(shí)現(xiàn)(數(shù)據(jù)成員、實(shí)現(xiàn)接口的函數(shù)體唬渗、私有函數(shù))
  3. 成員函數(shù):聲明必須在類(lèi)內(nèi)部典阵,但定義可在類(lèi)內(nèi)或外,定義在類(lèi)內(nèi)部的函數(shù)是隱式的inline函數(shù)
  4. this:指向類(lèi)類(lèi)型非常量版本的常量指針镊逝,所以不能在常量類(lèi)對(duì)象上調(diào)用普通成員函數(shù)
  5. 常量成員函數(shù):參數(shù)列表后帶const的函數(shù)叫常量成員函數(shù)壮啊,它可將this設(shè)置為指向常量的指針,使得常量對(duì)象可訪(fǎng)問(wèn)常量成員函數(shù)撑蒜,但不可寫(xiě)入新值歹啼;若以引用形式返回*this,則返回類(lèi)型是常量引用
  6. 合成的默認(rèn)構(gòu)造函數(shù):會(huì)盡可能使用類(lèi)內(nèi)初始值初始化數(shù)據(jù)成員座菠,當(dāng)類(lèi)不存在任何構(gòu)造函數(shù)時(shí)編譯器創(chuàng)建的默認(rèn)構(gòu)造函數(shù)狸眼;既需要其他形式又需要合成的默認(rèn)構(gòu)造函數(shù),可在默認(rèn)構(gòu)造函數(shù)的參數(shù)列表后面加上= default
  7. 類(lèi)的動(dòng)態(tài)內(nèi)存:當(dāng)類(lèi)需要分配類(lèi)對(duì)象之外的資源時(shí)浴滴,合成的版本常常會(huì)失效拓萌;需要?jiǎng)討B(tài)內(nèi)存的類(lèi)應(yīng)該使用vector或string對(duì)象管理存儲(chǔ)空間,避免分配和釋放內(nèi)存帶來(lái)的復(fù)雜性
  8. class和struct:唯一區(qū)別是默認(rèn)的訪(fǎng)問(wèn)權(quán)限升略,class為private微王,struct為public
  9. 友元:允許其他類(lèi)或函數(shù)訪(fǎng)問(wèn)非公有成員,則可在類(lèi)的開(kāi)頭用friend關(guān)鍵字將其聲明為友元品嚣;友元的聲明僅僅限定了權(quán)限炕倘,可在真正的函數(shù)聲明之后;友元函數(shù)可以定義在類(lèi)的內(nèi)部翰撑,但在類(lèi)的外部仍然需要提供相應(yīng)的聲明使得函數(shù)可見(jiàn)
  10. 可變數(shù)據(jù)成員:添加mutable關(guān)鍵字的數(shù)據(jù)成員罩旋,即使在const成員函數(shù)中,依舊可以被改變
  11. 類(lèi)內(nèi)初始值:必須使用符號(hào)或花括號(hào)的直接初始化形式
  12. 重載const:根據(jù)是否是常量對(duì)象,決定調(diào)用是否是常量版本的成員函數(shù)
  13. 類(lèi)的聲明:僅聲明不定義叫做前向聲明:類(lèi)在聲明之后涨醋、定義完成之前是不完全類(lèi)型瓜饥,可以定義其指針或引用,作為函數(shù)的參數(shù)或返回值浴骂;只有當(dāng)類(lèi)全部完成后類(lèi)才算被定義压固,所以類(lèi)的成員中不能包含自己,但可以出現(xiàn)指針或引用
  14. 類(lèi)的定義:編譯所有成員的聲明之后才會(huì)編譯函數(shù)體
  15. 類(lèi)型名的定義:內(nèi)層作用域可以重新定義外層作用域的名字靠闭,但若外層作用域中的某個(gè)名字表示類(lèi)型,則類(lèi)中不能再重新定義該名字
  16. 訪(fǎng)問(wèn)類(lèi)成員:使用this->或類(lèi)名::可強(qiáng)制訪(fǎng)問(wèn)類(lèi)成員坎炼,無(wú)視作用域的名字查找規(guī)則愧膀;無(wú)類(lèi)名加::表示全局對(duì)象
  17. 成員初始化:若成員是const、引用谣光、無(wú)默認(rèn)構(gòu)造函數(shù)的類(lèi)檩淋,必須通過(guò)初始值列表將其初始化
  18. 初始化順序:與類(lèi)中定義的順序一致,不受初始值列表中順序影響
  19. 默認(rèn)構(gòu)造函數(shù):當(dāng)對(duì)象被默認(rèn)初始化或值初始化時(shí)萄金,自動(dòng)執(zhí)行默認(rèn)構(gòu)造函數(shù)蟀悦;不那么明顯的一種情況是類(lèi)的某些數(shù)據(jù)成員缺少默認(rèn)構(gòu)造函數(shù)
  20. 默認(rèn)初始化場(chǎng)景:無(wú)任何初始值定義非靜態(tài)變量或數(shù)組,本身含有類(lèi)成員且使用合成的默認(rèn)構(gòu)造函數(shù)氧敢,類(lèi)類(lèi)型成員沒(méi)有在構(gòu)造函數(shù)初始值列表中顯式初始化
  21. 值初始化:初始值數(shù)量小于被初始化的數(shù)組大小日戈,不使用初始值定義局部靜態(tài)變量,通過(guò)T()表達(dá)式顯式請(qǐng)求值初始化
  22. 默認(rèn)構(gòu)造對(duì)象:使用默認(rèn)構(gòu)造函數(shù)定義對(duì)象的格式為類(lèi)名+對(duì)象名孙乖,無(wú)之后空的圓括號(hào)對(duì)浙炼,否則將定義為函數(shù)而非對(duì)象
  23. 類(lèi)類(lèi)型轉(zhuǎn)換:構(gòu)造函數(shù)只接受一個(gè)實(shí)參,則其定義了一種從構(gòu)造函數(shù)的參數(shù)類(lèi)型到類(lèi)類(lèi)型的隱式轉(zhuǎn)換規(guī)則唯袄;編譯器只會(huì)自動(dòng)執(zhí)行一步類(lèi)型轉(zhuǎn)換
  24. 顯式構(gòu)造函數(shù):在類(lèi)內(nèi)添加explicit關(guān)鍵字的構(gòu)造函數(shù)只能用于直接初始化弯屈,抑制隱式轉(zhuǎn)換;編譯器不會(huì)在自動(dòng)轉(zhuǎn)換過(guò)程中使用它恋拷,但可用于顯式的強(qiáng)制轉(zhuǎn)化
  25. 聚合類(lèi):所有成員public资厉、未定義構(gòu)造函數(shù)、無(wú)類(lèi)內(nèi)初始值蔬顾、無(wú)基類(lèi)或virtual函數(shù)宴偿;使用花括號(hào)初始化,花括號(hào)內(nèi)的初始值順序與聲明順序一致
  26. 字面值常量類(lèi):數(shù)據(jù)成員都是字面值類(lèi)型的聚合類(lèi)阎抒;或數(shù)據(jù)成員都是字面值類(lèi)型酪我、至少含有一個(gè)constexpr構(gòu)造函數(shù)、類(lèi)內(nèi)初始值是常量表達(dá)式或擁有自己的constexpr構(gòu)造函數(shù)且叁、使用析構(gòu)函數(shù)的默認(rèn)定義
  27. constexpr構(gòu)造函數(shù):為保證構(gòu)造函數(shù)的不包含返回語(yǔ)句都哭,和constexpr函數(shù)唯一可執(zhí)行語(yǔ)句即返回函數(shù),其函數(shù)體一般為空
  28. 靜態(tài)成員:獨(dú)立于任何對(duì)象之外,不包含this指針欺矫;靜態(tài)成員函數(shù)不能聲明為const纱新,也不能在內(nèi)部使用this指針
  29. 靜態(tài)數(shù)據(jù)成員:必須在類(lèi)的外部定義和初始化,方式和類(lèi)外部定義成員函數(shù)類(lèi)似穆趴;若靜態(tài)數(shù)據(jù)成員為constrexpr類(lèi)型脸爱,且其只限于編譯器替換值的使用場(chǎng)景,則可以在類(lèi)內(nèi)定義未妹,否則必須在類(lèi)外再重新定義
  30. 靜態(tài)成員的優(yōu)勢(shì):類(lèi)內(nèi)可包含自身類(lèi)型的靜態(tài)數(shù)據(jù)成員簿废,但普通成員只能是指針或引用;靜態(tài)成員可以作為默認(rèn)實(shí)參络它,非靜態(tài)數(shù)據(jù)成員的值屬于對(duì)象的一部分族檬,不能作為默認(rèn)實(shí)參

IO庫(kù)

  1. IO類(lèi)繼承機(jī)制:ifstream和istringstream繼承自istream,ofstream和ostringstream都繼承自ostream
  2. 寬字符IO類(lèi):在函數(shù)和類(lèi)型前加前綴w化戳,如wcin单料、wistream
  3. IO對(duì)象無(wú)拷貝賦值:IO操作的函數(shù)通常以引用方式傳遞和返回流;由于讀寫(xiě)會(huì)改變狀態(tài)点楼,IO對(duì)象的引用不能是const
  4. 條件狀態(tài):iostate表示流狀態(tài)的類(lèi)型扫尖,其包含4種constexpr值,badbit(流崩潰)掠廓、failbit(可恢復(fù)錯(cuò)誤)换怖、goodbit、eofbit蟀瞧;對(duì)應(yīng)4個(gè)函數(shù)bad()狰域、fail()、good()黄橘、eof()
  5. 管理?xiàng)l件狀態(tài):rdstate()獲取狀態(tài)兆览,clear()清除所有錯(cuò)誤標(biāo)志位,clear(flags)和setstate(flags)將狀態(tài)置為flags
  6. 刷新輸出緩沖區(qū):可使用操縱符endl(換行)塞关、flush抬探、ends(空字符);開(kāi)啟unitbuf每次調(diào)用flush帆赢,nounitbuf解除
  7. 關(guān)聯(lián)流:交互式系統(tǒng)通常關(guān)聯(lián)輸入和輸出流小压,使所有輸出在讀操作前被打印椰于;每個(gè)流同時(shí)最多關(guān)聯(lián)到一個(gè)流怠益,但多個(gè)流可以關(guān)聯(lián)到同一個(gè)ostream;將其關(guān)聯(lián)到空指針可徹底解開(kāi)關(guān)聯(lián)
  8. fstream特有:打開(kāi)文件綁定流的open()瘾婿、關(guān)閉綁定文件的close()蜻牢、文件是否成功打開(kāi)且尚未關(guān)閉的is_open()
  9. stringstream特有:將s拷貝到stringstream對(duì)象的str(s)烤咧、返回保存的string的拷貝的str()

順序容器

  1. 選擇容器:標(biāo)準(zhǔn)庫(kù)容器性能通常優(yōu)于同類(lèi)數(shù)據(jù)結(jié)構(gòu);C++標(biāo)準(zhǔn)新增array數(shù)組和forward_list單向鏈表抢呆;很多小元素且額外空間開(kāi)銷(xiāo)大煮嫌,不用list或forward_list
  2. 容器的額外操作:iterator表示迭代器類(lèi)型,size_type無(wú)符號(hào)整型抱虐,value_type指元素類(lèi)型昌阿,reference與value_type&等價(jià)
  3. size操作:返回容器內(nèi)元素?cái)?shù)量;forward_list沒(méi)有size操作恳邀,其他容器的size操作是常量時(shí)間
  4. 反向容器:reverse_iterator按逆序?qū)ぶ返牡髋潮瑀begin()是尾迭代器,crend()表示const首前迭代器谣沸,
  5. forward_list:不支持反向容器迭代器儿奶,且其迭代器不支持遞減運(yùn)算
  6. 容器初始化:必須是相同的容器類(lèi)型,且保存相同類(lèi)型的元素
  7. 用大小初始化:只有順序容器的構(gòu)造函數(shù)才接受大小參數(shù)鳄抒,關(guān)聯(lián)容器不支持
  8. array:具有固定大小,列表初始化的數(shù)目必須等于或小于array的大幸住许溅;花括號(hào)列表只能初始化不能賦值
  9. assign:僅順序容器支持,傳遞給assign的迭代器不能指向調(diào)用assign的容器秉版;會(huì)導(dǎo)致指向容器的迭代器贤重、引用、指針失效
  10. swap:除array外清焕,swap不對(duì)任何元素進(jìn)行拷貝并蝗、刪除、插入秸妥,可保證常數(shù)時(shí)間完成滚停;除string外,指向其他容器的迭代器粥惧、引用键畴、指針在swap后都不會(huì)失效
  11. 關(guān)系運(yùn)算符:兩邊的運(yùn)算對(duì)象必須是相同的容器類(lèi)型,且保存相同類(lèi)型的元素
  12. 插入元素:返回新添加的第一個(gè)元素的迭代器突雪;向vector起惕、string、deque插入元素咏删,會(huì)使指向的迭代器惹想、引用、指針失效督函;插入迭代器表示的范圍內(nèi)的一段元素時(shí)嘀粱,不能指向與目的位置相同的容器
  13. 元素是拷貝:用一個(gè)對(duì)象來(lái)初始化或插入容器時(shí)激挪,實(shí)際上放入的是拷貝,容器中元素與提供值的對(duì)象無(wú)任何關(guān)聯(lián)
  14. 訪(fǎng)問(wèn)元素:at和下標(biāo)操作只支持string草穆、vector灌灾、deque、array悲柱;訪(fǎng)問(wèn)成員函數(shù)返回的是引用
  15. 刪除元素:clear和pop返回void锋喜,erase返回指向最后一個(gè)被刪元素之后元素的迭代器
  16. 特殊的forward_list操作:添加或刪除通過(guò)改變給定元素之后的元素來(lái)完成;定義了首前迭代器before_begin()豌鸡;insert_after()返回指向最后一個(gè)插入元素的迭代器嘿般;erase_after()返回指向被刪元素之后的元素的迭代器
  17. 改變?nèi)萜鞔笮。簉esize()可用來(lái)增大或縮小容器涯冠,縮小容器則多余元素被刪除炉奴,增大則填充指定值或默認(rèn)初始值對(duì)象
  18. 不保存尾后迭代器:在循環(huán)中插入刪除deque、string蛇更、vector中元素瞻赶,應(yīng)每次重新調(diào)用end()
  19. 管理容器大小:capacity()返回容器保留內(nèi)存的大小派任,空容器返回0砸逊;reverse()只能增加容器保留內(nèi)存大小掌逛;減少所占空間可用shrink_to_fit()申請(qǐng)將空間值縮小到元素?cái)?shù)量师逸,但不保證一定退回內(nèi)存空間
  20. 重新分配內(nèi)存:只有執(zhí)行insert時(shí)size和capacity相等,或resize豆混、reserve時(shí)給定大小超過(guò)capacity篓像,vector才會(huì)分配新的內(nèi)存空間,分配量取決于底層實(shí)現(xiàn)
  21. 修改string:replace和insert所允許的參數(shù)形式args依賴(lài)于范圍range和位置pos是如何指定的
  22. string::npos:string搜索失敗返回的static成員皿伺,類(lèi)型是const string::size_type员辩,被初始化為-1
  23. string搜索:find()第一次出現(xiàn),rfind()最后一次出現(xiàn)鸵鸥,find_first_of()參數(shù)中任何一個(gè)字符第一次出現(xiàn)屈暗,find_last_not_of()非參數(shù)中的字符最后一次出現(xiàn);找到返回下標(biāo)脂男,沒(méi)找到返回npos
  24. string數(shù)值轉(zhuǎn)換:s=to_string(val); val = stoi(s, p, b); val可以是任何算術(shù)類(lèi)型养叛,對(duì)應(yīng)stoi函數(shù)替換為stol、stod等宰翅,p表示字符串開(kāi)始轉(zhuǎn)換的下標(biāo)弃甥,b表示轉(zhuǎn)換所用基數(shù)
  25. 容器適配器:容器適配器接受一個(gè)已有的容器類(lèi)型,使其行為看起來(lái)像一種不同類(lèi)型
  26. 底層容器:stack和queue默認(rèn)基于deque汁讼,priority_queue默認(rèn)基于vector淆攻;不能使用不能添加刪除元素的array阔墩,或不能訪(fǎng)問(wèn)尾元素的forward_list作為底層容器;stack可用除array和forward_list外的任何容器構(gòu)造瓶珊,queue可使用list或deque啸箫,priority_queue可基于vector或deque
  27. 適配器操作:每個(gè)適配器都基于底層容器類(lèi)型的操作定義了自己的特殊操作,只能使用適配器操作伞芹,不能使用底層容器操作
  28. 迭代器失效:添加或刪除元素可能使指向容器元素的指針忘苛、引用、迭代器失效
添加元素 刪除元素
vector唱较、string 存儲(chǔ)空間未重新分配扎唾,則插入位置之后失效;否則全部失效 被刪元素及之后失效
deque 在首尾添加只有迭代器失效南缓;否則全部失效 刪除首元素只首元素失效胸遇;刪除尾元素則尾后迭代器也失效;刪除首尾之間元素則全部失效
list汉形、forward_list 不影響 只有被刪元素受影響

范型算法

  1. 范型算法:實(shí)現(xiàn)了一些經(jīng)典算法的公共接口纸镊,可用于不同類(lèi)型的元素、多種類(lèi)型的容器概疆、其他類(lèi)型序列
  2. 迭代器與算法:算法工作于迭代器之上逗威,迭代器令算法不依賴(lài)于容器,但依賴(lài)于元素類(lèi)型的操作届案;算法永遠(yuǎn)不會(huì)執(zhí)行容器操作,所以不會(huì)改變底層容器的大小
  3. 輸入范圍:標(biāo)準(zhǔn)庫(kù)算法通常對(duì)一個(gè)范圍內(nèi)的元素進(jìn)行操作罢艾,用兩個(gè)迭代器參數(shù)表示左閉右開(kāi)區(qū)間
  4. 算法分類(lèi):是否讀取元素楣颠、改變?cè)亍⒅嘏旁仨樞?/li>
  5. 只讀算法:只讀取而不改變?cè)馗莉牵詈糜贸A康魍觯蝗粲?jì)劃用算法返回的迭代器改變?cè)刂担鸵獋鬟f非常量參數(shù)
  6. 寫(xiě)算法:算法不檢查寫(xiě)操作春锋,都假定目的位置空間足夠大;常見(jiàn)錯(cuò)誤有在剛定義的空容器上進(jìn)行fill_n或其他寫(xiě)操作;保證算法有足夠元素空間來(lái)容納輸出可用插入迭代器
  7. 迭代器參數(shù):一些算法讀兩個(gè)序列尸疆,不要求容器或元素類(lèi)型嚴(yán)格匹配仿畸,只要求兩個(gè)序列中的元素能夠比較
  8. 拷貝算法:copy返回目的位置迭代器(遞增后)的值;多個(gè)算法提供“拷貝”版本呐萌,接受一個(gè)額外的目的迭代器參數(shù)馁痴,將新序列拷貝到里面,而不改變?cè)斎敕秶男蛄?/li>
  9. 重排算法:去除容器重復(fù)元素的方法是肺孤,先調(diào)用重排算法sort和unique罗晕,再用容器操作erase
  10. 定制操作:算法默認(rèn)使用<或==運(yùn)算符完成济欢,但允許我們傳遞任何類(lèi)型的可調(diào)用對(duì)象,用自定義操作代替默認(rèn)運(yùn)算符
  11. 可調(diào)用對(duì)象:函數(shù)小渊、函數(shù)指針法褥、重載了函數(shù)調(diào)用符()的類(lèi)、lambda表達(dá)式
  12. 謂詞:返回可轉(zhuǎn)換為bool型的函數(shù)酬屉,通常用于判定元素關(guān)系半等;根據(jù)接受參數(shù)個(gè)數(shù)分為一元謂詞和二元謂詞
  13. lambda表達(dá)式:[捕獲列表] (參數(shù)列表) -> return 返回類(lèi)型 {函數(shù)體};某些時(shí)候參數(shù)列表和返回類(lèi)型可省略梆惯;不能有默認(rèn)參數(shù)
  14. 捕獲列表:只需捕獲局部非靜態(tài)變量酱鸭,分為值捕獲和引用捕獲;值捕獲的變量的值是lambda創(chuàng)建時(shí)的拷貝垛吗,若要改變需要在參數(shù)列表后加mutable關(guān)鍵字凹髓;引用捕獲要保證lambda執(zhí)行時(shí)變量仍存在,是否可變由是否是常量引用而定
  15. 隱式捕獲:讓編譯器根據(jù)lambda體中的代碼推斷需要使用哪些變量怯屉,使用&或=參數(shù)表示引用捕獲或值捕獲蔚舀;混合使用隱式和顯式捕獲時(shí),兩者捕獲方式必須不同
  16. lambda返回:lambda體只含有一個(gè)return語(yǔ)句可省略返回類(lèi)型锨络;否則lambda默認(rèn)將返回void赌躺,必須指定返回類(lèi)型
  17. bind函數(shù):auto newCallable = bind(callable, arg_list);傳給newCallable的參數(shù)會(huì)按照arg_list中占位符參數(shù)的順序傳給callable
  18. 占位符:形如_n羡儿,n為整數(shù)礼患;定義在std::placeholders的命名空間
  19. 綁定引用參數(shù):bind的那些不是占位符的參數(shù)默認(rèn)被拷貝到可調(diào)用對(duì)象中;希望傳遞給bind一個(gè)對(duì)象而不拷貝它掠归,必須使用ref或cref缅叠;bind、placeholders虏冻、ref都定義在頭文件functianal中
  20. 插入迭代器:back_inserter肤粱、inserter、front_inserter調(diào)用容器操作push_back厨相、insert领曼、push_front;*it蛮穿、++it庶骄、it++都返回it
  21. 流迭代器:將對(duì)應(yīng)流當(dāng)作特定類(lèi)型的元素序列處理;istream_iterator輸入践磅,ostream_iterator輸出
  22. istream_iterator:空的istream_iterator可作為尾后迭代器瓢姻;比較兩個(gè)istream_iterator是否相等必須讀取相同類(lèi)型,如果都是尾后迭代器或綁定到相同的輸入則相等
  23. ostream_iterator:it音诈、++it幻碱、it++都返回it绎狭;推薦使用it,可與其他迭代器的使用保持一致褥傍,將來(lái)修改更容易
  24. 反向迭代器:rbegin指向尾元素儡嘶、rend指向首前元素;遞增操作移動(dòng)到前一個(gè)元素恍风;反向迭代器的base操作可以得到普通迭代器蹦狂,但正反向迭代器互相轉(zhuǎn)換時(shí)指向的是不同元素
  25. 算法要求的迭代器:輸入迭代器、輸出迭代器朋贬、前向迭代器凯楔、雙向迭代器、隨機(jī)訪(fǎng)問(wèn)迭代器锦募;C++標(biāo)準(zhǔn)指明了算法的每個(gè)迭代器參數(shù)的最小類(lèi)別摆屯,但編譯器通常不會(huì)報(bào)該類(lèi)錯(cuò)
  26. 算法命名:接受謂詞來(lái)替代默認(rèn)運(yùn)算符、或不接受額外參數(shù)的算法通常是重載函數(shù)糠亩;接受謂詞來(lái)替代元素值的算法都有附加的_if虐骑,如find_if;拷貝到額外空間都有附加的_copy赎线,如replace_copy廷没;一些算法同時(shí)提供_copy和_if,如remove_copy_if
  27. 鏈表的算法:list和forward_list有自己的函數(shù)成員sort垂寥、merge颠黎、remove、reverse滞项、unique狭归,可改變底層容器,優(yōu)先使用它們而不是通用算法
  28. splice成員:鏈表特有的算法蓖扑,將一個(gè)鏈表的一截移動(dòng)到另一個(gè)鏈表的指定位置唉铜,要保證移動(dòng)的目的位置不在待移動(dòng)范圍內(nèi)

關(guān)聯(lián)容器

  1. 關(guān)聯(lián)容器分類(lèi):set還是map台舱、關(guān)鍵字是否重復(fù)律杠、關(guān)鍵字是否有序
  2. 關(guān)聯(lián)容器:可列表初始化;不支持位置相關(guān)操作竞惋,不支持參數(shù)為元素值和對(duì)應(yīng)數(shù)量的構(gòu)造或插入柜去;迭代器是雙向的
  3. 有序容器:關(guān)鍵字類(lèi)型必須定義了比較方法,默認(rèn)情況下使用<運(yùn)算符拆宛,可自定義一個(gè)嚴(yán)格弱序
  4. 嚴(yán)格弱序:不能同時(shí)“小于等于”對(duì)方嗓奢;“小于等于”具有傳遞性;雙方都不“小于等于”對(duì)方稱(chēng)為“等價(jià)”浑厚,“等價(jià)”具有傳遞性
  5. pair類(lèi)型:可用花括號(hào)包圍的初始化器來(lái)返回pair類(lèi)型的對(duì)象股耽,老版本只允許顯式構(gòu)造
  6. 關(guān)聯(lián)容器迭代器:map的value_type是pair<const key_type, mapped_type>根盒,所以map迭代器只能改變關(guān)鍵字映射的值,不能修改關(guān)鍵字物蝙;set的value_type等于key_type炎滞,都是const關(guān)鍵字,不能修改
  7. 關(guān)聯(lián)容器insert:只有當(dāng)關(guān)鍵字不存在時(shí)才插入诬乞,函數(shù)返回一個(gè)pair册赛,包含一個(gè)指向元素的迭代器,和一個(gè)指示是否插入成功的bool型
  8. 關(guān)聯(lián)容器erase:若傳入迭代器震嫉,必須保證指向真實(shí)元素森瘪;若傳入關(guān)鍵字,則返回被刪去的所有該關(guān)鍵字的元素的數(shù)量
  9. map的下標(biāo)操作:map下標(biāo)操作返回mapped_type票堵,解引用返回value_type扼睬;若關(guān)鍵字還不存在,會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)關(guān)鍵字且值為0的新元素换衬,已存在則返回最近一次賦的值痰驱;只能用于map和unorders_map
  10. 查找元素:find(第一個(gè)等于的迭代器)、count(數(shù)量)瞳浦、lower_bound(第一個(gè)大于等于的迭代器)担映、upper_bound(第一個(gè)大于的迭代器)、equal_range(返回一個(gè)迭代器pair叫潦,表示所有相等的頭及尾后位置)
  11. 無(wú)序關(guān)聯(lián)容器:使用關(guān)鍵字的哈希函數(shù)和==運(yùn)算符蝇完;不能直接定義關(guān)鍵字類(lèi)型為自定義類(lèi)類(lèi)型的無(wú)序容器,必須提供自己的hash模板版本矗蕊,或者用另一種方法短蜕,類(lèi)似于有序容器重載關(guān)鍵字類(lèi)型的默認(rèn)比較操作
  12. 管理桶:無(wú)序容器在存儲(chǔ)上組織為一組桶,每個(gè)桶保存哈希值相同的若干元素傻咖;無(wú)序容器的性能依賴(lài)于哈希函數(shù)的質(zhì)量和桶的數(shù)量及大信竽А;管理桶的函數(shù)包括桶接口卿操、桶迭代警检、哈希策略

動(dòng)態(tài)內(nèi)存

  1. 動(dòng)態(tài)內(nèi)存:除了靜態(tài)內(nèi)存和棧內(nèi)存,每個(gè)程序有自由空間(堆)害淤,用于存儲(chǔ)動(dòng)態(tài)分配的對(duì)象扇雕;自由空間中分配的對(duì)象直到顯式釋放或程序結(jié)束才被銷(xiāo)毀
  2. 智能指針:自動(dòng)釋放指向的對(duì)象及對(duì)象所占內(nèi)存;shared_ptr可多個(gè)指向一個(gè)對(duì)象窥摄,unique_ptr獨(dú)占所指對(duì)象镶奉;智能指針不支持指針?biāo)阈g(shù)運(yùn)算
  3. 引用計(jì)數(shù):shared_ptr關(guān)聯(lián)的計(jì)數(shù)器,拷貝shared_ptr時(shí)遞增,賦值或銷(xiāo)毀時(shí)遞減哨苛;計(jì)數(shù)器為0則自動(dòng)釋放管理對(duì)象
  4. 使用動(dòng)態(tài)內(nèi)存的場(chǎng)景:不知道對(duì)象數(shù)量鸽凶、不知道對(duì)象的準(zhǔn)確類(lèi)型、多個(gè)對(duì)象間共享數(shù)據(jù)
  5. 直接內(nèi)存管理:new分配內(nèi)存建峭,delete釋放吱瘩;不能依賴(lài)類(lèi)對(duì)象拷貝、賦值迹缀、銷(xiāo)毀的默認(rèn)定義使碾;內(nèi)置類(lèi)型默認(rèn)初始化為未定義,建議用圓括號(hào)直接初始化祝懂;只有當(dāng)括號(hào)中僅有單一初始化器時(shí)才可以使用auto
  6. 動(dòng)態(tài)分配的const:new分配const對(duì)象是合法的票摇,它的值不能被改變,但本身可用delete銷(xiāo)毀
  7. 空懸指針:指向一塊曾經(jīng)保存數(shù)據(jù)對(duì)象但現(xiàn)在無(wú)效的內(nèi)存的指針砚蓬;delete指針會(huì)變成空懸指針矢门,此時(shí)建議用nullptr給它賦值
  8. 初始化智能指針:不能進(jìn)行內(nèi)置指針到智能指針的隱式轉(zhuǎn)換,必須使用直接初始化形式灰蛙;智能指針默認(rèn)使用delete釋放祟剔,所以用于初始化智能指針的普通指針必須指向動(dòng)態(tài)內(nèi)存,管理的資源不是new分配的內(nèi)存摩梧,則必須傳入一個(gè)刪除器替代delete
  9. 混用智能指針和普通指針:shared_ptr綁定普通指針物延,不應(yīng)再使用內(nèi)置指針訪(fǎng)問(wèn)這塊內(nèi)存;只有確定代碼不會(huì)delete指針時(shí)才能使用get將訪(fǎng)問(wèn)權(quán)限傳遞給代碼仅父,不要用get初始化或給另一個(gè)智能指針賦值
  10. 修改shared_ptr共享對(duì)象:當(dāng)改變底層對(duì)象時(shí)調(diào)用unique判斷自己是否是僅有用戶(hù)叛薯,如果不是則用reset制作新拷貝
  11. unique_ptr:不支持普通的拷貝或賦值,但可拷貝或賦值一個(gè)即將銷(xiāo)毀的unique_ptr笙纤,如函數(shù)返回值耗溜;調(diào)用release或reset將指針的所有權(quán)從一個(gè)非const的unique_ptr轉(zhuǎn)移給另一個(gè)unique_ptr;調(diào)用reset()或用nullptr賦值可以釋放對(duì)象省容,release只會(huì)切斷管理關(guān)系
  12. unique_ptr的刪除器:管理方式與share_ptr不同抖拴,刪除器會(huì)影響到類(lèi)型及構(gòu)造過(guò)程;重載刪除器必須在尖括號(hào)里指明刪除器類(lèi)型腥椒,并在參數(shù)列表里指定一個(gè)可調(diào)用對(duì)象(刪除器)
  13. weak_ptr:是一種弱引用阿宅,指向shared_ptr的對(duì)象,但不改變引用計(jì)數(shù)寞酿;調(diào)用lock返回指向的shared_ptr對(duì)象家夺,當(dāng)對(duì)象計(jì)數(shù)器為0時(shí)返回空shared_ptr
  14. 分配動(dòng)態(tài)數(shù)組:使用new T[]分配指定數(shù)量的內(nèi)存脱柱,返回的是元素類(lèi)型指針而不是數(shù)組伐弹;可用空括號(hào)或花括號(hào)對(duì)數(shù)組初始化,但不能在括號(hào)中出現(xiàn)初始化器,所以不能用auto惨好;可分配0長(zhǎng)度的數(shù)組煌茴,此時(shí)返回的指針類(lèi)似尾后指針
  15. 釋放動(dòng)態(tài)數(shù)組:delete []釋放,空的方括號(hào)是必須的日川,否則會(huì)沒(méi)有警告但行為異常
  16. 動(dòng)態(tài)數(shù)組的智能指針:unique_ptr管理new分配的數(shù)組蔓腐,在尖括號(hào)里的對(duì)象類(lèi)型后面跟一對(duì)空括號(hào),不能使用點(diǎn)或箭頭運(yùn)算符龄句,可使用下標(biāo)運(yùn)算符訪(fǎng)問(wèn)數(shù)組中的元素回论;shared_ptr不能直接管理動(dòng)態(tài)數(shù)組,必須提供自己的刪除器分歇,并且只能通過(guò)get內(nèi)置指針后進(jìn)行指針?biāo)阈g(shù)運(yùn)算來(lái)訪(fǎng)問(wèn)數(shù)組元素
  17. allocator類(lèi):allocate分配一定大小的原始未構(gòu)造的內(nèi)存傀蓉;deallocate的參數(shù)必須是allocate返回的指針和allocate傳入的大小职抡;deallocate前調(diào)用destroy析構(gòu)已創(chuàng)建的每個(gè)對(duì)象葬燎,allocate后調(diào)用cnostruct構(gòu)造對(duì)象、或調(diào)用uninitialized_copy[_n]拷貝對(duì)象缚甩、或uninitialized_fill[_n]填充未初始化的內(nèi)存

拷貝控制

  1. 拷貝控制成員函數(shù):拷貝構(gòu)造谱净、拷貝賦值、移動(dòng)構(gòu)造擅威、移動(dòng)賦值壕探、析構(gòu);不顯式定義則編譯器會(huì)生成合成版本
  2. 逐成員拷貝/移動(dòng):合成的拷貝和移動(dòng)構(gòu)造函數(shù)及拷貝與移動(dòng)賦值運(yùn)算符的工作方式郊丛,依次處理非stastic數(shù)據(jù)成員
  3. 拷貝構(gòu)造函數(shù):第一個(gè)參數(shù)必須是引用浩蓉,常是const;不應(yīng)設(shè)為explicit宾袜,因?yàn)槟承┣闆r下需隱式調(diào)用
  4. 拷貝初始化:直接初始化要求編譯器使用普通的函數(shù)匹配捻艳,拷貝初始化則是將右側(cè)運(yùn)算對(duì)象拷貝到正在創(chuàng)建的對(duì)象中,并可能發(fā)生類(lèi)型轉(zhuǎn)換庆猫;拷貝初始化發(fā)生在用=定義變量认轨、實(shí)參傳遞給非引用形參、返回類(lèi)型為非引用月培、花括號(hào)列表初始化數(shù)組中的元素或聚合類(lèi)中的元素嘁字、初始化標(biāo)準(zhǔn)庫(kù)容器或調(diào)用其insert或push成員
  5. 繞過(guò)拷貝控制構(gòu)造:編譯器可以(非必需)跳過(guò)拷貝/移動(dòng)構(gòu)造函數(shù),直接創(chuàng)建對(duì)象
  6. 重載運(yùn)算符:若運(yùn)算符是成員函數(shù)杉畜,其左側(cè)運(yùn)算對(duì)象綁定到隱式this參數(shù)纪蜒;對(duì)二元運(yùn)算符,右側(cè)運(yùn)算對(duì)象作為顯式參數(shù)傳遞
  7. 賦值運(yùn)算符:接受同類(lèi)參數(shù)此叠,返回指向左側(cè)運(yùn)算對(duì)象的引用
  8. 析構(gòu)函數(shù):釋放對(duì)象使用資源纯续,并銷(xiāo)毀非stastic數(shù)據(jù)成員;不接受參數(shù),不能重載猬错;先執(zhí)行函數(shù)體窗看,再按初始化的逆序隱式銷(xiāo)毀成員;內(nèi)置指針類(lèi)型不會(huì)delete對(duì)象倦炒,智能指針是類(lèi)類(lèi)型所有可以釋放显沈;引用和值指針離開(kāi)作用域不析構(gòu)綁定對(duì)象
  9. 三/五法則:5個(gè)拷貝控制成員應(yīng)看作整體,定義了一個(gè)則應(yīng)定義所有
  10. 使用=default:顯式要求編譯器生成合成版本的默認(rèn)構(gòu)造函數(shù)或拷貝控制成員逢唤;類(lèi)內(nèi)聲明=default為內(nèi)聯(lián)
  11. 阻止拷貝:定義刪除的拷貝控制函數(shù)拉讯;新標(biāo)準(zhǔn)發(fā)布前,通常將拷貝控制成員聲明為private鳖藕,并且不定義它們
  12. 刪除的函數(shù):使用=delete在函數(shù)第一次出現(xiàn)時(shí)聲明遂唧,之后不能以任何方式調(diào)用這些函數(shù);析構(gòu)函數(shù)不能是刪除吊奢,否則不能定義該類(lèi)型對(duì)象盖彭,只能new動(dòng)態(tài)分配并無(wú)法釋放;一個(gè)類(lèi)有數(shù)據(jù)成員不能默認(rèn)構(gòu)造页滚、拷貝召边、復(fù)制、摧毀則會(huì)被定義為刪除的
  13. 拷貝語(yǔ)義:類(lèi)的行為像值裹驰,有自己的狀態(tài)隧熙;類(lèi)的行為像指針,共享狀態(tài)幻林;IO和unique_ptr不允許拷貝或賦值贞盯,值和指針都不像
  14. 類(lèi)值拷貝賦值:自賦值也是安全的,發(fā)生異常后左側(cè)對(duì)象狀態(tài)仍有意義沪饺;先拷貝構(gòu)造右側(cè)對(duì)象到臨時(shí)變量躏敢,再銷(xiāo)毀左側(cè)成員并賦予新值
  15. 引用計(jì)數(shù):用于類(lèi)指針拷貝控制成員中共享狀態(tài),構(gòu)造整葡、創(chuàng)建副本件余、賦值左側(cè)遞增,銷(xiāo)毀遭居、賦值右側(cè)遞減
  16. 拷貝并交換:在賦值運(yùn)算符中啼器,參數(shù)不是引用,此時(shí)結(jié)合拷貝和交換的賦值運(yùn)算符是安全的
  17. 自定義拷貝控制成員:除了資源管理的原因俱萍,一些類(lèi)還需要拷貝控制成員的幫助來(lái)進(jìn)行簿記工作或其他操作端壳,它們所具有的公共工作應(yīng)放在private的工具函數(shù)中完成
  18. 動(dòng)態(tài)內(nèi)存管理類(lèi):alloc_n_copy (allocate, uninitialized_copy), free(destroy, deallocate), push_back (chk_n_alloc, construct), chk_n_alloc (capacity, reallocate), reallocate (construct(std::move), free)
  19. 右值引用:用&&獲得,表示即將銷(xiāo)毀的對(duì)象枪蘑;返回非引用類(lèi)型的函數(shù)损谦、算數(shù)岖免、關(guān)系、位以及后置遞增遞減運(yùn)算符成翩,用const左值引用或右值引用綁定;返回左值引用的函數(shù)赦役、賦值麻敌、下標(biāo)、解引用掂摔、和前置遞增遞減運(yùn)算符术羔,用非const左值綁定;綁定右值引用的變量仍是左值
  20. std::move:顯式將左值轉(zhuǎn)換為對(duì)應(yīng)的右值類(lèi)型乙漓,調(diào)用move意味著之后只能對(duì)其銷(xiāo)毀或賦值
  21. 移動(dòng)操作:第一個(gè)參數(shù)是非const右值引用级历,移動(dòng)后源對(duì)象會(huì)被銷(xiāo)毀,這意味著它必須可析構(gòu)叭披;定義了移動(dòng)操作寥殖,則必須定義自己的拷貝操作,因?yàn)楹铣傻目截惒僮鲿?huì)被認(rèn)為是刪除的
  22. noexcept:聲明和定義不拋出異常的移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值函數(shù)都要顯式指定noexcept涩蜘,否則系統(tǒng)會(huì)使用拷貝操作
  23. 合成的移動(dòng)操作:沒(méi)有任何自定義的拷貝控制成員嚼贡,且每個(gè)非stastic數(shù)據(jù)成員都可以移動(dòng)時(shí),編譯器才會(huì)為他們合成移動(dòng)構(gòu)造函數(shù)或移動(dòng)賦值運(yùn)算符
  24. 移動(dòng)和拷貝:編譯器使用普通的函數(shù)匹配規(guī)則確定使用哪個(gè)拷貝控制成員同诫;通吃敛撸拷貝左值,移動(dòng)右值误窖;如果沒(méi)有移動(dòng)構(gòu)造函數(shù)叮盘,右值也被拷貝
  25. std::make_move_iterator:將普通迭代器轉(zhuǎn)化為移動(dòng)迭代器,解引用得到右值引用霹俺;與uninitialized_copy結(jié)合可調(diào)用移動(dòng)構(gòu)造替代拷貝構(gòu)造
  26. 引用限定:用來(lái)指出一個(gè)非stastic成員函數(shù)可用于左值(&)或右值(&&)對(duì)象柔吼;放在參數(shù)列表或const之后可區(qū)分重載版本;同名同參數(shù)列表的函數(shù)必須都加引用限定符或都不加

重載運(yùn)算與類(lèi)型轉(zhuǎn)換

  1. 重載運(yùn)算符:至少含有一個(gè)類(lèi)類(lèi)型參數(shù)丙唧,除函數(shù)調(diào)用運(yùn)算符外都不能含有默認(rèn)實(shí)參嚷堡;優(yōu)先級(jí)、結(jié)合律艇棕、運(yùn)算對(duì)象個(gè)數(shù)與內(nèi)置版本一致蝌戒;返回類(lèi)型通常和內(nèi)置版本兼容;可以像普通函數(shù)一樣顯式調(diào)用
  2. 不重載的運(yùn)算符:多數(shù)可以重載沼琉,除了(:: .* . ?:)北苟;不應(yīng)該重載逗號(hào)、取地址(具有特殊含義)打瘪,不應(yīng)重載邏輯與邏輯或(無(wú)法保留求值順序)
  3. 是否重載為成員:改變成員狀態(tài)或與給定類(lèi)型密切相關(guān)應(yīng)為成員函數(shù)友鼻,左側(cè)運(yùn)算對(duì)象必須是運(yùn)算符所屬類(lèi)的一個(gè)對(duì)象傻昙;具有對(duì)稱(chēng)性的通常設(shè)計(jì)為普通非成員函數(shù)
  4. 重載IO:必須為非成員函數(shù),輸出應(yīng)減少格式化操作彩扔,輸入能夠在出錯(cuò)時(shí)將對(duì)象恢復(fù)
  5. 算術(shù)運(yùn)算符:若類(lèi)含有算術(shù)或位運(yùn)算符妆档,最好也定義復(fù)合賦值運(yùn)算符,前者用后者實(shí)現(xiàn)
  6. 關(guān)系運(yùn)算符:相等和不等應(yīng)將其一工作委托給另一個(gè)虫碉;當(dāng)兩個(gè)對(duì)象不等時(shí)贾惦,必須能夠用關(guān)系運(yùn)算符比出大小
  7. 賦值運(yùn)算符:拷貝賦值、移動(dòng)賦值敦捧、使用其它類(lèi)型作為右側(cè)運(yùn)算對(duì)象(如vector使用花括號(hào)的元素列表賦值)
  8. 下標(biāo)運(yùn)算符:同時(shí)定義兩個(gè)版本须板,返回普通引用的成員和返回常量引用的常量成員
  9. 遞增/遞減運(yùn)算符:前置改變值后返回引用,后置版本接受一個(gè)額外不被用的值為0的int形參兢卵,對(duì)象存入臨時(shí)變量习瑰,改變值后返回保存改變前的臨時(shí)變量的值
  10. 成員訪(fǎng)問(wèn)運(yùn)算符:包括解引用和箭頭運(yùn)算符,箭頭運(yùn)算符一般將工作委托給解引用秽荤,通常都定義為const成員
  11. 箭頭運(yùn)算符:重載的箭頭運(yùn)算符必須返回類(lèi)的指針甜奄,此時(shí)直接執(zhí)行(*point).mem;或返回自定義了箭頭運(yùn)算符的某個(gè)類(lèi)的對(duì)象窃款,遞歸執(zhí)行point.operator()->mem贺嫂,直到返回指針
  12. 函數(shù)調(diào)用運(yùn)算符:像函數(shù)一樣使用類(lèi),類(lèi)包含狀態(tài)所以比普通函數(shù)更靈活雁乡,定義了函數(shù)調(diào)用運(yùn)算符的類(lèi)叫函數(shù)對(duì)象
  13. lambda:編譯器將lambda表達(dá)式翻譯成未命名類(lèi)的未命名函數(shù)對(duì)象第喳,該類(lèi)中包含重載的函數(shù)調(diào)用運(yùn)算符;lambda默認(rèn)不改變捕獲的變量踱稍,所以函數(shù)調(diào)用運(yùn)算符是const成員曲饱,如果lambda被聲明為可變的,則調(diào)用運(yùn)算符不是const珠月;產(chǎn)生的類(lèi)不含默認(rèn)構(gòu)造函數(shù)扩淀、賦值運(yùn)算符及默認(rèn)析構(gòu)函數(shù)
  14. 標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)象:一組表示算術(shù)運(yùn)算符、關(guān)系運(yùn)算符啤挎、邏輯運(yùn)算符的類(lèi)驻谆,每個(gè)類(lèi)分別定義了執(zhí)行命名操作的調(diào)用運(yùn)算符;都是模版類(lèi)庆聘,并可適用于指針判斷指向?qū)ο?/li>
  15. 可調(diào)用對(duì)象:函數(shù)胜臊、函數(shù)指針、lambda表達(dá)式伙判、bind創(chuàng)建的對(duì)象象对、重載了函數(shù)調(diào)用運(yùn)算符的類(lèi)
  16. 調(diào)用形式:指明返回類(lèi)型和傳遞給調(diào)用的實(shí)參類(lèi)型,如int(int, int)
  17. 標(biāo)準(zhǔn)庫(kù)function類(lèi):模版類(lèi)型是調(diào)用形式宴抚,對(duì)象是可調(diào)用對(duì)象勒魔;可將運(yùn)算符與對(duì)應(yīng)的可調(diào)用function對(duì)象存入函數(shù)表甫煞;與舊版本的unary_function和binary_function無(wú)關(guān),這兩個(gè)已經(jīng)被更通用的bind替代
  18. 重載與function:將重載存入function會(huì)產(chǎn)生二義性問(wèn)題冠绢,解決方法有存儲(chǔ)指針和使用lambda
  19. 類(lèi)型轉(zhuǎn)換運(yùn)算符:沒(méi)有顯式返回類(lèi)型抚吠、沒(méi)有形參的const成員函數(shù);可以面向除void外的任意可作為函數(shù)返回值的類(lèi)型定義
  20. 顯式類(lèi)型轉(zhuǎn)換運(yùn)算符:開(kāi)頭添加explicit關(guān)鍵字弟胀,避免隱式轉(zhuǎn)換導(dǎo)致的異常楷力;但如果表達(dá)式被用作條件,仍然被隱式執(zhí)行邮利;想bool的轉(zhuǎn)換一般被定義為explicit operator bool()
  21. 類(lèi)型轉(zhuǎn)換與二義性:兩個(gè)類(lèi)提供相同的類(lèi)型轉(zhuǎn)換弥雹,無(wú)法利用本身也面臨二義性的強(qiáng)制類(lèi)型轉(zhuǎn)換解決垃帅;類(lèi)中定義了多個(gè)轉(zhuǎn)換源或目標(biāo)是算數(shù)類(lèi)型的轉(zhuǎn)換延届;調(diào)用重載函數(shù)時(shí),若多個(gè)定義的類(lèi)型轉(zhuǎn)換都提供了可行匹配贸诚,它們一樣好方庭;類(lèi)可轉(zhuǎn)化為算術(shù)類(lèi)型,并重載了運(yùn)算符酱固;運(yùn)算符調(diào)用不能通過(guò)調(diào)用形式區(qū)分成員和非成員

面向?qū)ο蟪绦蛟O(shè)計(jì)

  1. 面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP):數(shù)據(jù)抽象(分離接口和實(shí)現(xiàn))械念、繼承(相似類(lèi)型建模)、動(dòng)態(tài)綁定(忽略相似類(lèi)型區(qū)別)
  2. 虛函數(shù):基類(lèi)希望派生類(lèi)定義自己版本的函數(shù)运悲,聲明的返回類(lèi)型前加virtual龄减;虛函數(shù)在派生類(lèi)中隱式為虛函數(shù),可不加virtual班眯;每個(gè)派生類(lèi)中用于覆蓋的虛函數(shù)希停,在聲明后必須定義;聲明時(shí)可在形參列表后加override編譯檢測(cè)
  3. 類(lèi)派生列表:冒號(hào)后緊跟以逗號(hào)隔開(kāi)的直接基類(lèi)列表署隘,每個(gè)基類(lèi)前有訪(fǎng)問(wèn)說(shuō)明符以控制訪(fǎng)問(wèn)
  4. 動(dòng)態(tài)綁定:使用基類(lèi)的引用或指針調(diào)用虛函數(shù)時(shí)宠能,函數(shù)的版本在運(yùn)行時(shí)根據(jù)動(dòng)態(tài)類(lèi)型決定
  5. 派生類(lèi)構(gòu)造函數(shù):每個(gè)類(lèi)控制自己成員的初始化,派生類(lèi)必須使用基類(lèi)的構(gòu)造函數(shù)初始化基類(lèi)部分磁餐,沒(méi)有顯示初始化的部分都會(huì)執(zhí)行默認(rèn)初始化
  6. 靜態(tài)成員:整個(gè)繼承體系中只存在靜態(tài)成員的唯一定義
  7. 派生類(lèi)聲明:聲明語(yǔ)句的目的是令程序知曉某個(gè)名字的存在及它是怎樣的實(shí)體违崇,所以派生類(lèi)聲明不包含派生列表;一個(gè)類(lèi)作為基類(lèi)前诊霹,一定要定義而非僅聲明
  8. 防止繼承:在類(lèi)名或函數(shù)形參列表后加final關(guān)鍵字羞延,可防止其他類(lèi)再繼承它
  9. 派生類(lèi)轉(zhuǎn)基類(lèi):引用、內(nèi)置指針和智能指針都支持派生類(lèi)向基類(lèi)的轉(zhuǎn)換脾还;編譯時(shí)可知的為靜態(tài)類(lèi)型肴楷,運(yùn)行時(shí)動(dòng)態(tài)綁定變量在內(nèi)存中的動(dòng)態(tài)類(lèi)型
  10. 基類(lèi)轉(zhuǎn)派生類(lèi):含有虛函數(shù)的基類(lèi)可使用dynamic_cast在運(yùn)行時(shí)請(qǐng)求轉(zhuǎn)換為指定派生類(lèi),確定安全可轉(zhuǎn)換的使用static_cast強(qiáng)制覆蓋掉編譯器的檢查工作
  11. 轉(zhuǎn)換規(guī)則:只對(duì)指針和引用有效荠呐,可能因訪(fǎng)問(wèn)受限無(wú)法轉(zhuǎn)換赛蔫;由于大多類(lèi)定義了拷貝控制成員砂客,將派生類(lèi)對(duì)象也可轉(zhuǎn)為基類(lèi)對(duì)象,但派生部分會(huì)被切掉呵恢,只處理基類(lèi)部分
  12. 覆蓋:派生類(lèi)中與基類(lèi)中形參和返回類(lèi)型相同的函數(shù)可覆蓋基類(lèi)函數(shù)鞠值,一個(gè)例外是返回類(lèi)型是指針或引用且可發(fā)生類(lèi)型轉(zhuǎn)換
  13. 虛函數(shù)的默認(rèn)實(shí)參:實(shí)參值由本次調(diào)用的靜態(tài)類(lèi)型決定
  14. 作用域運(yùn)算符:回避虛函數(shù)的動(dòng)態(tài)綁定機(jī)制,覆蓋原有的查找規(guī)則渗钉,指定某個(gè)版本的虛函數(shù)
  15. 純虛函數(shù):類(lèi)內(nèi)函數(shù)聲明語(yǔ)句后加=0彤恶,定義與否皆可
  16. 抽象基類(lèi):含有或未經(jīng)覆蓋直接繼承純虛函數(shù)的類(lèi),負(fù)責(zé)定義接口給后續(xù)類(lèi)覆蓋鳄橘;不能直接創(chuàng)建抽象基類(lèi)的對(duì)象
  17. 重構(gòu):重新設(shè)計(jì)類(lèi)的體系以便移動(dòng)操作或數(shù)據(jù)声离,必須重新編譯
  18. 受保護(hù)成員:類(lèi)使用protected聲明那些希望與派生類(lèi)共享但不想被其他公共訪(fǎng)問(wèn)使用的成員;派生類(lèi)的成員或友元只能通過(guò)派生類(lèi)對(duì)象來(lái)訪(fǎng)問(wèn)基類(lèi)的受保護(hù)對(duì)象瘫怜,不能通過(guò)基類(lèi)
  19. 訪(fǎng)問(wèn)權(quán)限:受基類(lèi)中成員和派生列表中訪(fǎng)問(wèn)說(shuō)明符共同影響术徊;struct默認(rèn)公有繼承,class默認(rèn)私有繼承鲸湃;派生訪(fǎng)問(wèn)說(shuō)明符對(duì)派生類(lèi)成員及友元能夠直接訪(fǎng)問(wèn)基類(lèi)成員不影響赠涮,只會(huì)控制派生類(lèi)用戶(hù)(包括派生類(lèi)的派生類(lèi))對(duì)基類(lèi)成員的訪(fǎng)問(wèn)權(quán)限
  20. 向基類(lèi)轉(zhuǎn)換的可訪(fǎng)問(wèn)性:只有當(dāng)可以訪(fǎng)問(wèn)基類(lèi)的公有成員時(shí),決定派生類(lèi)向基類(lèi)的轉(zhuǎn)換才是可訪(fǎng)問(wèn)的
  21. 類(lèi)的用戶(hù):邊寫(xiě)代碼使用類(lèi)的普通用戶(hù)只能訪(fǎng)問(wèn)公有成員暗挑,負(fù)責(zé)編寫(xiě)類(lèi)成員和友元的實(shí)現(xiàn)者還能訪(fǎng)問(wèn)私有(實(shí)現(xiàn))部分
  22. 友元關(guān)系:不能傳遞笋除,不能繼承;每個(gè)類(lèi)負(fù)責(zé)控制各自成員的訪(fǎng)問(wèn)權(quán)限
  23. 改變可訪(fǎng)問(wèn)性:派生類(lèi)可為那些它可以訪(fǎng)問(wèn)的名字提供using聲明炸裆,置于期望的成員訪(fǎng)問(wèn)說(shuō)明符后垃它;構(gòu)造函數(shù)的using聲明不改變構(gòu)造函數(shù)訪(fǎng)問(wèn)級(jí)別;using指定explicit或constexpr無(wú)效
  24. 隱藏:派生類(lèi)作用域嵌套在基類(lèi)作用域內(nèi)烹看,所以派生類(lèi)中定義的成員隱藏同名的基類(lèi)成員
  25. 名字查找與繼承:確定對(duì)象的靜態(tài)類(lèi)型国拇;再在本類(lèi)和基類(lèi)向上遞歸查找同名函數(shù);找到后進(jìn)行類(lèi)型檢查是否調(diào)用合法听系;合法則看調(diào)用的是不是虛函數(shù)贝奇,是虛函數(shù)則根據(jù)動(dòng)態(tài)類(lèi)型確定運(yùn)行版本,不是虛函數(shù)或通過(guò)對(duì)象調(diào)用的則產(chǎn)生常規(guī)函數(shù)調(diào)用
  26. 覆蓋重載函數(shù):一條基類(lèi)成員函數(shù)的using聲明可以把該函數(shù)所有的重載實(shí)例添加到派生類(lèi)作用域中靠胜,此時(shí)派生類(lèi)只需定義其特有的函數(shù)
  27. 虛析構(gòu)函數(shù):基類(lèi)的析構(gòu)函數(shù)如果不是虛函數(shù)掉瞳,delete指向派生類(lèi)的基類(lèi)指針將產(chǎn)生未定義
  28. 合成拷貝控制:對(duì)直接基類(lèi)部分拷貝后,再拷貝類(lèi)本身的成員浪漠;銷(xiāo)毀本身后再銷(xiāo)毀基類(lèi)陕习,基類(lèi)部分會(huì)自動(dòng)銷(xiāo)毀;基類(lèi)是否是合成版本無(wú)影響址愿,只要對(duì)應(yīng)成員可訪(fǎng)問(wèn)且不是刪除的函數(shù)
  29. 移動(dòng)操作:基類(lèi)多有虛析構(gòu)函數(shù)该镣,所以不會(huì)合成移動(dòng)操作,如果確實(shí)需要應(yīng)首先在基類(lèi)中顯式定義响谓,此時(shí)要同時(shí)顯式定義拷貝操作
  30. 定義拷貝操作:基類(lèi)默認(rèn)構(gòu)造函數(shù)初始化派生類(lèi)對(duì)象的基類(lèi)部分损合,如果想拷貝或移動(dòng)基類(lèi)部分省艳,則需要在派生類(lèi)的構(gòu)造函數(shù)初始值列表中顯式使用基類(lèi)的拷貝或移動(dòng)構(gòu)造函數(shù)析構(gòu);自定義的析構(gòu)函數(shù)只負(fù)責(zé)銷(xiāo)毀派生類(lèi)自己分配的資源嫁审;構(gòu)造或析構(gòu)函數(shù)調(diào)用了虛函數(shù)跋炕,則應(yīng)該執(zhí)行與其所屬類(lèi)型對(duì)應(yīng)版本的虛函數(shù)
  31. 繼承的構(gòu)造函數(shù):類(lèi)不能繼承默認(rèn)、拷貝和移動(dòng)構(gòu)造函數(shù)律适,如果沒(méi)有直接定義則編譯器會(huì)合成它們辐烂,即使繼承了基類(lèi)的其他構(gòu)造函數(shù);派生類(lèi)數(shù)據(jù)成員將被默認(rèn)初始化
  32. 基類(lèi)構(gòu)造含默認(rèn)實(shí)參:派生類(lèi)將獲得多個(gè)繼承的構(gòu)造函數(shù)捂贿,每個(gè)分別省略掉一個(gè)有默認(rèn)實(shí)參的形參
  33. 容器與繼承:容器中應(yīng)放置(智能)指針而非對(duì)象
  34. 繼承與組合:派生類(lèi)應(yīng)反映與基類(lèi)的Is A關(guān)系纠修,公有派生類(lèi)的對(duì)象應(yīng)該可以用在任何需要基類(lèi)對(duì)象的地方;類(lèi)型之間Has A則暗含成員的意思
  35. 接口類(lèi):在抽象基類(lèi)中聲明一個(gè)接口類(lèi)的友元厂僧,接口類(lèi)中包含該抽象基類(lèi)指針扣草,負(fù)責(zé)隱藏整個(gè)繼承體系

模版與泛型編程

  1. 動(dòng)態(tài)類(lèi)型:面向?qū)ο缶幊淘谶\(yùn)行時(shí)確定類(lèi)型,泛型編程在編譯時(shí)獲知類(lèi)型
  2. 模版:泛型編程基礎(chǔ)吁系,一個(gè)創(chuàng)建類(lèi)或函數(shù)的藍(lán)圖德召,適用于編譯時(shí)才確定類(lèi)和函數(shù)類(lèi)型的情況
  3. 模板定義:以template開(kāi)始白魂,后跟尖括號(hào)包圍的模板參數(shù)列表汽纤,內(nèi)含一個(gè)或多個(gè)由逗號(hào)分隔的模板參數(shù)
  4. 實(shí)例化函數(shù)模板:調(diào)用模板時(shí),隱式或顯示的指明模板實(shí)參缺菌,實(shí)例化出一個(gè)特定版本的稱(chēng)為實(shí)例的函數(shù)
  5. 模板參數(shù):類(lèi)型參數(shù)可看作類(lèi)型說(shuō)明符跷究,跟在class或typename關(guān)鍵字之后锦庸;非類(lèi)型參數(shù)表是一個(gè)值,通過(guò)特定類(lèi)型名指定背传,可以是常量表達(dá)式的整型,或具有靜態(tài)生存期的指針或引用
  6. 泛型代碼原則:盡量減少對(duì)實(shí)參類(lèi)型的要求台夺,函數(shù)參數(shù)是const引用径玖,條件判斷僅用<比較運(yùn)算
  7. 模板編譯:由于實(shí)例化時(shí)需要掌握函數(shù)模版和類(lèi)模版成員函數(shù)的定義,其定義通常也放在頭文件中颤介,與普通函數(shù)和普通類(lèi)成員函數(shù)不同
  8. 實(shí)例化類(lèi)模板:必須提供顯式模板實(shí)參梳星,每種元素類(lèi)型生成的各個(gè)實(shí)例類(lèi)之間無(wú)關(guān)聯(lián),擁有各自的static成員
  9. 類(lèi)模版成員函數(shù):定義在類(lèi)外需用template開(kāi)始滚朵,后跟類(lèi)模版參數(shù)列表冤灾;實(shí)例化了的類(lèi)模板,其成員只有在用到時(shí)才實(shí)例化
  10. 類(lèi)模板和友元:非模板友元被授權(quán)訪(fǎng)問(wèn)所有類(lèi)模板實(shí)例辕近,模板友元可根據(jù)聲明訪(fǎng)問(wèn)特定實(shí)例或所有實(shí)例
  11. 模板類(lèi)型別名:不能用typedef引用模板韵吨,新標(biāo)準(zhǔn)可使用using定義別名,如template <typename T> using partNo = pair<T, unsigned>; parNode<string> books; partNo<Student> kids;
  12. 模板參數(shù)作用域:在模板內(nèi)不能重用模板參數(shù)名移宅,正常的名字隱藏規(guī)則依舊適用归粉;用作用域運(yùn)算符訪(fǎng)問(wèn)類(lèi)的類(lèi)型成員時(shí)椿疗,需在句首加typename關(guān)鍵字,否則會(huì)被默認(rèn)為static成員
  13. 默認(rèn)模板實(shí)參:就標(biāo)準(zhǔn)只允許類(lèi)模板有默認(rèn)實(shí)參糠悼,新標(biāo)允許函數(shù)模板也有默認(rèn)實(shí)參变丧;調(diào)用類(lèi)模板時(shí)必須加上尖括號(hào),即使所有參數(shù)都有默認(rèn)值
  14. 成員模板:無(wú)論普通類(lèi)還模板類(lèi)中绢掰,本身是模板的成員函數(shù)叫成員模板痒蓬,不能是虛函數(shù);在類(lèi)模板外定義成員模板滴劲,必須同時(shí)為兩者提供模板參數(shù)列表
  15. 顯式實(shí)例化:避免相同模板參數(shù)產(chǎn)生多個(gè)實(shí)例導(dǎo)致的額外開(kāi)銷(xiāo)攻晒;可用extern多次聲明實(shí)例,但必須有且僅有一次定義班挖;編譯器會(huì)實(shí)例化該類(lèi)的所有成員鲁捏,所以顯式實(shí)例化提供的類(lèi)型必須能用于所有成員
  16. 智能指針的刪除器:shared_ptr保存刪除器指針,方便運(yùn)行時(shí)傳遞可調(diào)用對(duì)象重置萧芙;unique_ptr中包含顯式實(shí)例化的刪除器成員给梅,避免間接調(diào)用刪除器時(shí)的運(yùn)行開(kāi)銷(xiāo)
  17. 類(lèi)型參數(shù)轉(zhuǎn)換:通常不轉(zhuǎn)換而是生成一個(gè)新的模板實(shí)例;有限可用的轉(zhuǎn)換規(guī)則包括const轉(zhuǎn)換和數(shù)組或函數(shù)指針轉(zhuǎn)換双揪;非模板類(lèi)型參數(shù)正常轉(zhuǎn)換
  18. 顯式模板實(shí)參:在函數(shù)之后动羽,實(shí)參列表前用尖括號(hào)提供顯式實(shí)參;只有尾部的顯式模板實(shí)參渔期,并且可從函數(shù)參數(shù)推斷出來(lái)的時(shí)候运吓,才可忽略;顯式指定的實(shí)參可正常類(lèi)型轉(zhuǎn)換
  19. 尾置返回類(lèi)型:需要根據(jù)傳入的參數(shù)確定返回類(lèi)型時(shí)疯趟,可通過(guò)decltype推斷形參作為返回類(lèi)型拘哨,使用尾置返回類(lèi)型格式返回
  20. 標(biāo)準(zhǔn)庫(kù)類(lèi)型轉(zhuǎn)換模板:定義在頭文件type_traits中,每個(gè)模板有一個(gè)公有成員type用于轉(zhuǎn)換信峻,不能轉(zhuǎn)換時(shí)則返回模板參數(shù)類(lèi)型本身倦青;如remove_reference可將T&、T&&盹舞、T轉(zhuǎn)換為T(mén)
  21. 函數(shù)指針:用函數(shù)模板初始化函數(shù)指針時(shí)产镐,根據(jù)指針的類(lèi)型推斷模板實(shí)參;使用顯式模板實(shí)參消除二義性
  22. 引用折疊:間接創(chuàng)建引用的引用矾策,除右值引用的右值引用折疊為右值引用磷账,其他3種引用的引用都折疊為左值引用
  23. 右值引用形參:可傳給它任意類(lèi)型的實(shí)參,若傳引用也不改變左/右值屬性贾虽;通常用于模板轉(zhuǎn)發(fā)實(shí)參或模板重載逃糟;使用右值引用的函數(shù)模板通常重載綁定非const右值引用或const左值引用
  24. 轉(zhuǎn)發(fā):函數(shù)參數(shù)指向模板類(lèi)型參數(shù)的右值引用,可保持對(duì)應(yīng)實(shí)參的const屬性和左/右值屬性;進(jìn)一步為解決接受右值引用參數(shù)不被理解為左值的問(wèn)題绰咽,使用utility頭文件中定義的forward菇肃,返回顯式實(shí)參的右值引用,可保持實(shí)參類(lèi)型的所有細(xì)節(jié)
  25. 函數(shù)模版匹配:候選函數(shù)包括所有模板實(shí)參推斷生成的實(shí)例取募,模板和非模板的可行函數(shù)統(tǒng)一按類(lèi)型轉(zhuǎn)換排序琐谤,多個(gè)函數(shù)同樣好則順次選擇唯一的非模板函數(shù)、無(wú)非模板函數(shù)時(shí)最特例化的模板函數(shù)玩敏,否則調(diào)用有歧義
  26. 可變參數(shù)模板:接受可變數(shù)目參數(shù)的模板函數(shù)或模板類(lèi)斗忌;class...、typename...旺聚、type-name...指定參數(shù)包织阳,之后跟零個(gè)或多個(gè)參數(shù),用sizeof...(args)獲取參數(shù)個(gè)數(shù)砰粹;如template <typename… Args> void foo(const Args& … args)中唧躲,Args是模板參數(shù)包,args是函數(shù)參數(shù)包
  27. 可變參數(shù)函數(shù)模板:可變參數(shù)函數(shù)通常是遞歸的碱璃,非可變參數(shù)版本的聲明必須在作用域內(nèi)弄痹,否則無(wú)限遞歸
  28. 包擴(kuò)展:將一個(gè)包分解為多個(gè)元素,并對(duì)每個(gè)元素應(yīng)用模式嵌器,通過(guò)在模式后添加省略號(hào)觸發(fā)
  29. 轉(zhuǎn)發(fā)參數(shù)包:參數(shù)定義為右值引用 foo(Args&&… args)肛真,轉(zhuǎn)發(fā)時(shí)應(yīng)用forward模式 bar(std::forward<Args>(args)…)
  30. 函數(shù)模板特例化:必須為每個(gè)模板函數(shù)提供實(shí)參,關(guān)鍵字template后跟一對(duì)空的尖括號(hào)嘴秸;特例化的本質(zhì)是實(shí)例化毁欣,而非重載庇谆,因此不影響函數(shù)匹配
  31. 特例化與作用域:所有同名模板的聲明應(yīng)放在同一頭文件的前面岳掐,在該文件內(nèi)再接著聲明這些模板的特例化版本。
  32. 類(lèi)模板特例化:若不指定全部參數(shù)部分特例化饭耳,則得到的是模板串述,所以要先定義模板參數(shù);也可以事先只特例化特定成員函數(shù)寞肖,之后調(diào)用相同類(lèi)型時(shí)則會(huì)調(diào)用該特例化函數(shù)而非重新實(shí)例化該成員函數(shù)
  33. 無(wú)序容器與特例化:無(wú)序容器會(huì)組合使用關(guān)鍵字類(lèi)型對(duì)應(yīng)的特例化hash版本纲酗,和關(guān)鍵字類(lèi)型上的相等運(yùn)算符

轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市新蟆,隨后出現(xiàn)的幾起案子觅赊,更是在濱河造成了極大的恐慌,老刑警劉巖琼稻,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吮螺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鸠补,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)萝风,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人紫岩,你說(shuō)我怎么就攤上這事规惰。” “怎么了泉蝌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵歇万,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我勋陪,道長(zhǎng)堕花,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任粥鞋,我火速辦了婚禮缘挽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呻粹。我一直安慰自己壕曼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布等浊。 她就那樣靜靜地躺著腮郊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筹燕。 梳的紋絲不亂的頭發(fā)上轧飞,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音撒踪,去河邊找鬼过咬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛制妄,可吹牛的內(nèi)容都是我干的掸绞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼耕捞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衔掸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俺抽,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敞映,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后磷斧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體振愿,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诗芜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埃疫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伏恐。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栓霜,靈堂內(nèi)的尸體忽然破棺而出翠桦,到底是詐尸還是另有隱情,我是刑警寧澤胳蛮,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布销凑,位于F島的核電站,受9級(jí)特大地震影響仅炊,放射性物質(zhì)發(fā)生泄漏斗幼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一抚垄、第九天 我趴在偏房一處隱蔽的房頂上張望蜕窿。 院中可真熱鬧,春花似錦呆馁、人聲如沸桐经。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阴挣。三九已至,卻和暖如春纺腊,著一層夾襖步出監(jiān)牢的瞬間畔咧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工揖膜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誓沸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓次氨,卻偏偏與公主長(zhǎng)得像蔽介,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煮寡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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