• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Onway

            我是一只菜菜菜菜鳥(niǎo)...
            posts - 61, comments - 56, trackbacks - 0, articles - 34

            《C++ Primer 中文版》筆記

            Posted on 2011-12-04 14:12 Onway 閱讀(725) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 使用說(shuō)明

            變量

            1. 可以通過(guò)extern關(guān)鍵字聲明變量而不定義它。

            2. 如果聲明有初始化式,那么它被當(dāng)做是定義。

            3. 只有當(dāng)extern聲明位于函數(shù)外部時(shí),才可以含有初始化式。

            函數(shù)

            1. 帶默認(rèn)參數(shù)的函數(shù),聲明與定義誰(shuí)在前誰(shuí)給出默認(rèn)值。

            2. 如果局部地聲明一個(gè)同名函數(shù),則該函數(shù)將屏蔽而不是重載在外層作用域聲明的同名函數(shù)。

            指針

            1)int a[3][4];a==&a[0];a[0]==&a[0][0];

            1. a[0]==*(a+0) *(a[0]+1)==*(*(a+0)+1)==a[0][1];

            2. 在二維數(shù)組中,a[0]不是值,是地址。

            3. a[i][j]==*(*(a+i)+j);

            名字作用域

            1)用來(lái)區(qū)分名字的不同意義的上下文稱為作用域。名字的作用域指的是知道該名字的程序文本區(qū)。

            2)一個(gè)名稱可以和不同作用域的不同實(shí)體相關(guān)聯(lián)。

            3)定義在所有函數(shù)外部的名字具有全局作用域。

            4)定義在函數(shù)內(nèi)部的名字具有局部作用域。

            1. 定義在語(yǔ)句中的名字具有局域作用域。

            2. 可以將一個(gè)非const變量定義在一個(gè)文件中,在另外的文件中,只要做了合適的聲明,就可以使用該變量。

            7)在全局作用域聲明的const變量是定義該對(duì)象的文件的局部變量。

            8)非const變量默認(rèn)為extern,要使const變量能夠在其他的文件中訪問(wèn),必須顯式指定為extern.

            Const對(duì)象

            1)const變量默認(rèn)是文件的局部變量。

            2)在頭文件定義const變量,任何包含該頭文件的源文件都不會(huì)出現(xiàn)重定義的情況,原因是const變量默認(rèn)是文件作用域。這樣出現(xiàn)的結(jié)果是每個(gè)源文件都定義了自己的const變量。

            4)由于編譯時(shí)的替換,在運(yùn)行時(shí)不會(huì)有任何存儲(chǔ)空間存儲(chǔ)常量表達(dá)式初始化的const變量。

            5)如果const變量不是用常量表達(dá)式初始化,那么它就不應(yīng)該在頭文件定義。相反,和其他的變量一樣,該const變量應(yīng)在源文件定義并初始化。應(yīng)在頭文件為它添加extern聲明,以別其他文件共享。

            6)2010-11-3(下午,const引用)

            1. 引用不能改變指向,且必須初始化才能使用

            2. const引用與指向const的引用是同一個(gè)意思

            3. 非const引用不能指向const對(duì)象。

            4. const引用可以指向非const對(duì)象。

            5. const引用可以指向相關(guān)類(lèi)型或是右值。

            6. const引用只能讀取,不能通過(guò)const引用改變其所指向?qū)ο蟮闹怠?/p>

            預(yù)處理器

            1)#include設(shè)施是C++預(yù)處理器的一部分。

            2)預(yù)處理器處理程序源碼在編譯器之前運(yùn)行。

            3)設(shè)計(jì)頭文件是,我們必須保證多次包含同一頭文件不會(huì)引起該頭文件定義的類(lèi)和對(duì)象被多次定義。

            4)預(yù)處理器允許我們自定義變量,預(yù)處理器變量的名字在程序中必須是唯一的。任何與預(yù)處理器變量相匹配的名字的使用都關(guān)聯(lián)到該預(yù)處理器變量。

            5)預(yù)處理器變量有兩種狀態(tài):已定義和未定義。定義預(yù)處理器變量和檢測(cè)器狀態(tài)所用的預(yù)處理器指示不同。

            6)頭文件應(yīng)該含有保護(hù)符,即使這些頭文件不會(huì)被其他頭文件包含。編寫(xiě)頭文件保護(hù)符不難,而且如果頭文件被包含多次,它可以避免難以理解的編譯錯(cuò)誤。

            頭文件

            1. 頭文件一般包含類(lèi)的定義,extern變量的聲明和函數(shù)的聲明。

            2. 因?yàn)轭^文件包含在多個(gè)源文件中,所以不應(yīng)該含有變量或函數(shù)的定義。

            3. 對(duì)于頭文件不應(yīng)該含有定義這一規(guī)則,有三個(gè)例外。頭文件可以定義類(lèi),值在編譯時(shí)就已知的const對(duì)象和inline函數(shù)。這些實(shí)體可在多個(gè)源文件中定義,只要每個(gè)源文件中的定義是相同的。

            4. 類(lèi),const對(duì)象,inline函數(shù)是具有文件作用域。

              5. typedef不是定義也不是聲明,是一個(gè)編譯前的預(yù)處理。具有文件作用域。

            2010-10-14

            1. 標(biāo)準(zhǔn)庫(kù)定義了四個(gè)IO對(duì)象,分別是cin,cout,cerr,clog.

            2. c++成對(duì)注釋是從C繼承過(guò)來(lái)的。

            3. wchar_t是內(nèi)置類(lèi)型,用于擴(kuò)展字符集,比如漢字和日語(yǔ),這些字符集中的一些字符不能用單個(gè)char表示。

            4. 轉(zhuǎn)義字符沒(méi)有十進(jìn)制數(shù)字形式,\ooo表示八進(jìn)制表示轉(zhuǎn)義,\xooo表示十六進(jìn)制表示。

            5. 操作符的替代名用于支持某些不支持標(biāo)準(zhǔn)C++操作符集的字符集,不能用作變量標(biāo)識(shí)符。

            6. 標(biāo)識(shí)符不能包含兩個(gè)連續(xù)下劃線,不能下劃線開(kāi)頭緊跟一個(gè)大寫(xiě)字母,在函數(shù)外定義的標(biāo)識(shí)符不能以下劃線開(kāi)頭。

            7. 定義用于分配空間,指定初始值;定義包含了聲明;extern用于聲明。


            2010-10-16

            1. 標(biāo)準(zhǔn)庫(kù)類(lèi)型不允許做復(fù)制或是賦值操作

              1. 只有支持復(fù)制的元素類(lèi)型才可以存儲(chǔ)在vector或其他容器類(lèi)型里。

              2. 形參或返回類(lèi)型不能為流類(lèi)型。如需傳遞或返回IO對(duì)象,則必須使用指針或引用。

            1. 如果一個(gè)流調(diào)用tie函數(shù)將其本身綁在傳遞給tie的ostream實(shí)參對(duì)象上,則該流上的任何IO操作都會(huì)刷新實(shí)參所關(guān)聯(lián)的緩沖區(qū)。如果在調(diào)用tie函數(shù)時(shí)傳遞實(shí)參“0”,則打破改流上已存在的捆綁。

            2. 由于歷史原因,IO標(biāo)準(zhǔn)庫(kù)使用C風(fēng)格字符串,而不是C++ string類(lèi)型作為文件名。

            3. 對(duì)于用ofstream打開(kāi)的文件,要保存文件中已存在的數(shù)據(jù),唯一的方法是顯示指定app模式打開(kāi)。

            4. string類(lèi)型轉(zhuǎn)C風(fēng)格字符串用c_str成員函數(shù)。

            5. 逗號(hào)操作符的求解過(guò)程:首先計(jì)算它的每一個(gè)操作數(shù),然后返回最右邊操作數(shù)作為整個(gè)操作的結(jié)果。

            6. 每個(gè)IO對(duì)象管理一個(gè)緩沖區(qū),用于存儲(chǔ)程序讀寫(xiě)的數(shù)據(jù)。

            7. 要使用標(biāo)準(zhǔn)庫(kù)定義的字符串流,必須包含頭文件sstream。


            2010-10-23 (第九章,容器和算法)

            1. 這些容器類(lèi)型的差別在于他們提供哪些操作,但是如果兩個(gè)容器提供了相同的操作,則他們的接口(函數(shù)名字和參數(shù)個(gè)數(shù))應(yīng)該相同。

            2. 所有的容器都是類(lèi)模板。所有的容器類(lèi)型都定義了默認(rèn)構(gòu)造函數(shù),由于創(chuàng)建指定的容器對(duì)象。

            3. 不提供元素初始化式時(shí),標(biāo)準(zhǔn)庫(kù)將為該容器實(shí)現(xiàn)值初始化。采用這種類(lèi)型的初始化,元素類(lèi)型必須是內(nèi)置或復(fù)合類(lèi)型,或者是提供了默認(rèn)構(gòu)造函數(shù)的類(lèi)類(lèi)型。如果元素類(lèi)型沒(méi)有默認(rèn)構(gòu)造函數(shù),則必須顯示指定其元素初始化式。

            4. 容器元素類(lèi)型必須滿足以下兩個(gè)(最低限度的)約束:

            a,元素類(lèi)型必須支持賦值運(yùn)算。

            b,元素類(lèi)型的對(duì)象必須可以復(fù)制。

            1. 除了引用類(lèi)型外,所有內(nèi)置或是復(fù)合類(lèi)型都可以用做元素類(lèi)型。引用不支持一般意義的賦值運(yùn)算,因此沒(méi)有元素是引用類(lèi)型的容器。

            2. 除輸入輸出標(biāo)準(zhǔn)庫(kù)類(lèi)型之外,所有其他標(biāo)準(zhǔn)庫(kù)類(lèi)型都是有效地容器元素類(lèi)型。特別地,容器本身也滿足上述要求,因此,可以定義元素本身就是容器類(lèi)型的容器。

            3. 此外,一些容器操作對(duì)元素類(lèi)型還有特殊要求。如果元素類(lèi)型不支持這些特殊要求,則相關(guān)的容器操作就不能執(zhí)行:我們可以定義該類(lèi)型的容器,單不能使用某些特定的操作。

            4. 其中一種需外加類(lèi)型要求的容器操作是指定容器大小并提供單個(gè)初始化式的構(gòu)造函數(shù)。如果容器存儲(chǔ)類(lèi)類(lèi)型的對(duì)象,那么只有當(dāng)其元素類(lèi)型提供默認(rèn)構(gòu)造函數(shù)時(shí),容器才能使用這種構(gòu)造函數(shù)。

            5. 在指定容器元素為容器類(lèi)型時(shí),必須如下(兩個(gè)同向尖括號(hào)之間)使用空格。

            6. 每種容器類(lèi)型都提供若干共同工作的迭代器類(lèi)型。與容器類(lèi)型一樣,所有迭代器具有相同的接口:如果某種迭代器支持某種操作,那么支持這種操作的其他迭代器也會(huì)以相同的方式支持這種操作。

            7. 無(wú)法檢查迭代器是否有效,也無(wú)法通過(guò)測(cè)試來(lái)發(fā)現(xiàn)迭代器是否已經(jīng)失效。任何無(wú)效迭代器的使用都可能導(dǎo)致運(yùn)行時(shí)錯(cuò)誤,單程序不一定崩潰,否則檢查這種錯(cuò)誤也許會(huì)容易些。

            8. 簡(jiǎn)單地說(shuō),逆序迭代器從后向前遍歷容器,并反轉(zhuǎn)了某些相關(guān)的迭代器操作:例如,在逆序迭代器上做++運(yùn)算將指向容器中的前一個(gè)元素。

            9. 所有的容器類(lèi)型都支持用關(guān)系操作符來(lái)實(shí)現(xiàn)兩個(gè)容器的比較。

            10. 容器的比較是基于容器內(nèi)元素的比較,容器的比較使用了元素類(lèi)型定義的同一個(gè)關(guān)系操作符……。


            2010-10-24早 (續(xù)上)

            1. 對(duì)于所有的容器類(lèi)型,如果resize操作壓縮了容器,則指向已刪除的元素的迭代器失效。

            2. 使用下標(biāo)運(yùn)算的另一個(gè)可選方案是at成員函數(shù)。這個(gè)函數(shù)的行為和下標(biāo)運(yùn)算相似,但是如果給出的下標(biāo)無(wú)效,at函數(shù)將會(huì)拋出out_of_range異常。

            3. 與賦值相關(guān)的操作符都作用于整個(gè)容器。……賦值后,左右兩邊的容器相等:盡管賦值前兩個(gè)容器的長(zhǎng)度可能不相等,但賦值后兩個(gè)容器都具有右操作數(shù)的長(zhǎng)度。

            4. 完成swap操作后,盡管被交換的元素已經(jīng)存放在另一容器中,但迭代器仍然指向相同的元素。

            5. 如果在不同(或相同)類(lèi)型的容器內(nèi),元素類(lèi)型不相同但是互相兼容,則其賦值運(yùn)算必須使用assign函數(shù)。

            6. 帶有一對(duì)迭代器參數(shù)的assign操作允許我們將一個(gè)容器的元素賦給另一個(gè)不同類(lèi)型的容器。

            7. swap操作實(shí)現(xiàn)交換兩個(gè)容器內(nèi)所有元素的功能。要交換的容器的類(lèi)型必須匹配:操作數(shù)必須是相同類(lèi)型的容器,而且所存儲(chǔ)的元素類(lèi)型也必須相同。

            8. capacity操作獲取在容器需要分配更多的存儲(chǔ)空間之前能夠存儲(chǔ)的元素總數(shù),而reserve操作則告訴vector容器應(yīng)該預(yù)留多少個(gè)元素的存儲(chǔ)空間。

            9. 每當(dāng)vector容器不得不分配新額存儲(chǔ)空間時(shí),以加倍當(dāng)前容量的分配策略實(shí)現(xiàn)重新分配。

            10. 元素是否連續(xù)存儲(chǔ)還會(huì)顯著地影響:

            a,在容器的中間位置添加或刪除元素的代價(jià)

            b,執(zhí)行容器元素的隨機(jī)訪問(wèn)的代價(jià)

            1. 通常來(lái)說(shuō),除非找到選擇使用其他容器的更好理由,否則vector容器都是最佳選擇。

            2. 本質(zhì)上,適配器是使一事物的行為類(lèi)似于另一事物的行為的一種機(jī)制。容器適配器讓一種已存在的容器類(lèi)型采用另一種不同德抽象類(lèi)型的工作方式實(shí)現(xiàn)。

            3. 所有容器適配器都根據(jù)其基礎(chǔ)容器類(lèi)型所支持的操作來(lái)定義自己的操作。


            2010-10-31下午(第十章 關(guān)聯(lián)容器)

            1. 關(guān)聯(lián)容器和順序容器的本質(zhì)區(qū)別在于:關(guān)聯(lián)容器通過(guò)鍵(key)存儲(chǔ)和讀取元素,而順序容器則通過(guò)元素在容器的位置順序存儲(chǔ)和訪問(wèn)元素。

            2. set和map類(lèi)型的對(duì)象所包含的元素都具有不同的鍵,不允許為同一個(gè)鍵添加第二個(gè)元素。

            3. 如果在創(chuàng)建pair對(duì)象時(shí)不提供初始化式,則調(diào)用默認(rèn)構(gòu)造函數(shù)對(duì)其成員采用值初始化。

            4. 在使用關(guān)聯(lián)容器時(shí),它的鍵不但有一個(gè)類(lèi)型,而且還有一個(gè)相關(guān)的比較函數(shù)。……所用的比較函數(shù)必須在建類(lèi)型上定義嚴(yán)格弱排序。……對(duì)于兩個(gè)鍵,如果它們互相之間都不存在“小于”關(guān)系,則容器將之視為相同的鍵。

            5. 在學(xué)習(xí)map的接口時(shí),需謹(jǐn)記value_type是pair類(lèi)型,它的值成員可以修改,但鍵成員不能修改。

            6. 用下標(biāo)訪問(wèn)不存在的元素將導(dǎo)致在map容器中添加一個(gè)新的元素,它的鍵即為該下標(biāo)值。

            7. map迭代器返回value_type類(lèi)型的值——包含const key_type和mapped_type類(lèi)型成員的pair對(duì)象;下標(biāo)操作則返回一個(gè)mapped_type類(lèi)型的值。

            8. 插入單個(gè)元素的insert版本使用鍵值pair類(lèi)型的參數(shù)。類(lèi)似的,對(duì)于參數(shù)為一對(duì)迭代器的版本,迭代器必須指向鍵值pair類(lèi)型的元素。

            9. 如果試圖插入的元素所對(duì)應(yīng)的鍵已在容器中,則inset將不再做任何操作。

            10. 使用下標(biāo)存在一個(gè)很危險(xiǎn)的副作用:如果該鍵不再map容器中,那么下標(biāo)操作會(huì)插入一個(gè)具有該鍵的新元素。

            11. 當(dāng)然,在執(zhí)行count后再適用下標(biāo)操作,實(shí)際上是對(duì)元素作了兩次查找。如果希望當(dāng)元素存在時(shí)就使用它,則應(yīng)該用find操作。

            12. 當(dāng)只想知道一個(gè)值是否存在時(shí),使用set容器是最適合的。

            13. set不支持下標(biāo)操作符,而且沒(méi)有定義mapped_type類(lèi)型。在set容器中,value_type不是pair類(lèi)型,而是與key_type相同的類(lèi)型。它們指的都是set中存儲(chǔ)的元素類(lèi)型。

            14. 與map容器的操作一樣,帶有一個(gè)鍵參數(shù)的insert返回pair類(lèi)型對(duì)象,包含一個(gè)迭代器和一個(gè)bool值,迭代器指向擁有改建的元素,而bool值表明是否添加了元素。使用迭代器對(duì)的insert版本返回void類(lèi)型。

            15. 由于鍵不要求是唯一的,因此每次調(diào)用insert總會(huì)添加一個(gè)元素。

            16. 在multimap和multiset容器中,如果某個(gè)鍵對(duì)應(yīng)多個(gè)實(shí)例,則這些實(shí)例在容器中將相鄰存放。lower_bound返回的迭代器不一定指向擁有特定鍵的元素。如果改鍵不在容器中,則lower_bound返回在保持容器元素順序的前提下該鍵應(yīng)被插入第一個(gè)位置。



            2010-11-4(下午,泛型算法)

            1. ……因?yàn)樗麄儗?shí)現(xiàn)相同的操作,所以稱之為“算法”;而“泛型”指的是它們可以操作在多種容器類(lèi)型上……

            2. 類(lèi)似地,由于指針的行為與作用在內(nèi)置數(shù)組上的迭代器一樣,因此也可以使用find來(lái)搜索數(shù)組……

            3. 泛型算法本身從不執(zhí)行容器操作,只是單獨(dú)依賴迭代器和迭代器操作實(shí)現(xiàn)。算法基于迭代器及其操作實(shí)現(xiàn),而并非基于容器操作。這個(gè)事實(shí)也許比較意外,但本質(zhì)上暗示了:使用“普通”的迭代器時(shí),算法從不修改基礎(chǔ)容器的大小。正如我們所看到的,算法也許會(huì)改變存儲(chǔ)在容器的元素的值,也許會(huì)在容器內(nèi)移動(dòng)元素,但是,算法從不直接添加或刪除元素。

            4. 除了少數(shù)例外情況,所有算法都在一段范圍內(nèi)的元素上操作,我們將這段范圍稱為“輸入范圍(input range)”。帶有輸入范圍參數(shù)的算法總是使用頭兩個(gè)形參標(biāo)記該范圍。

            5. 理解算法的最基本方法是了解該算法是否讀元素,寫(xiě)元素或者對(duì)元素進(jìn)行重新排序。

            6. 通常,泛型算法都是在標(biāo)記容器(或其他序列)內(nèi)的元素范圍的迭代器上操作的。標(biāo)記范圍的兩個(gè)實(shí)參類(lèi)型必須精確匹配,而迭代器本身必須標(biāo)記一個(gè)范圍:它們必須指向同一個(gè)容器中的元素(或者超出容器的下一位置),并且如果兩者不相等,則第一個(gè)迭代器通過(guò)不斷地自增,必須可以到達(dá)第二個(gè)迭代器。

            7. 有些算法直接將數(shù)據(jù)寫(xiě)到輸入序列,另外一些則帶有一個(gè)額外的迭代器參數(shù)指定寫(xiě)入目標(biāo)。這類(lèi)算法將目標(biāo)迭代器用作輸出的位置。還有第三種算法將指定數(shù)目的元素寫(xiě)入某個(gè)序列。

            8. 對(duì)指定數(shù)目的元素寫(xiě)入運(yùn)算,或者寫(xiě)入目標(biāo)迭代器的算法,都不檢查目標(biāo)的大小是否足以存儲(chǔ)要寫(xiě)入的元素。

            9. 通常,用迭代器給容器元素賦值時(shí),被賦值的是迭代器所指向的元素。而使用插入迭代器賦值時(shí),則會(huì)在容器中添加一個(gè)新元素,其值等于賦值運(yùn)算的右操作數(shù)的值。

            10. 謂詞是做某些檢測(cè)的函數(shù),返回用于條件判斷的類(lèi)型,指出條件是否成立。

            11. 標(biāo)準(zhǔn)庫(kù)所定義的迭代器不依賴于特定的容器。事實(shí)上,C++語(yǔ)言還提供了另外三種迭代器:(1)插入迭代器(2)iostream迭代器(3)反向迭代器。

            12. 流迭代器只定義了最基本的迭代器操作:自增,解引用和賦值。此外,可比較兩個(gè)istream迭代器是否相等(或不等)。而ostream迭代器則不提供比較運(yùn)算。

            13. 流迭代器都是類(lèi)模板:任何已定義輸入操作符(>>操作符)的類(lèi)型都可以定義istream_iterator。類(lèi)似地,任何已定義輸出操作符(<<操作符)的類(lèi)型也可以定義ostream_iterator.


            2010-11-7(續(xù)上)

            1. 由于不能反向遍歷流,因此流迭代器不能創(chuàng)建反向迭代器。

            2. 使用普通的迭代器對(duì)反向迭代器進(jìn)行初始化或賦值時(shí),所得到的迭代器并不是指向原迭代器所指向的元素。

            3. 迭代器可根據(jù)所提供的操作集進(jìn)行分類(lèi)。

            4. 所有標(biāo)準(zhǔn)庫(kù)容器提供的迭代器都至少達(dá)到雙向迭代器的要求。

            5. C++標(biāo)準(zhǔn)為所有泛型和算術(shù)算法的每一個(gè)迭代器形參指定了范圍最小的迭代器種類(lèi)。

            6. 向算法傳遞無(wú)效的迭代器類(lèi)別所引起的錯(cuò)誤,無(wú)法保證會(huì)在編譯時(shí)被捕獲到。

            7. 算法最基本的性質(zhì)是需要使用的迭代器種類(lèi)。所有算法都指定了它的每個(gè)迭代器形參可使用的迭代器類(lèi)型。

            8. 盡管幾乎所有算法都有輸入范圍,但算法是否使用其他形參取決于它所執(zhí)行的操作。

            9. 如果dest是容器上的迭代器,則算法將輸出內(nèi)容寫(xiě)到容器中已存在的元素上。更普遍的用法是,將dest與某個(gè)插入迭代器或者ostream_iterator綁定在一起。

            10. 帶有beg2而不帶end2的算法將beg2視為第二個(gè)輸入范圍的首元素,但沒(méi)有指定該范圍最后一個(gè)元素。這些算法假定以beg2開(kāi)始的范圍至少與beg和end指定的范圍一樣大。

            11. 標(biāo)準(zhǔn)庫(kù)為這些算法提供另外命名的版本,而非重載版本,其原因在于這兩種版本的算法帶有相同數(shù)目的形參。……此時(shí),如果使用重載版本,則可能導(dǎo)致二義性,盡管這個(gè)可能出現(xiàn)的幾率很低。

            12. 對(duì)于list對(duì)象,應(yīng)該優(yōu)先使用list容器特有的成員版本,而不是泛型算法。

            13. List容器特有的算法與其泛型算法之間有兩個(gè)至關(guān)重要的差別。其中一個(gè)是remove和unique的list版本修改了其關(guān)聯(lián)的基礎(chǔ)容器……另一個(gè)差別是list容器提供的merge和splice運(yùn)算會(huì)破壞它們的實(shí)參。

              14. 習(xí)題11.23,五種迭代器各自支持的操作。

              輸入迭代器

              1. 相等與不等 2)前后置自增

              3)右操作數(shù)解引用 4)箭頭操作符

              輸出迭代器

              1. 前后置自增 2)左操作數(shù)解引用

              (對(duì)迭代器值要求恰好寫(xiě)入一次)

              前向迭代器

              1. 所有輸入輸出迭代器的操作

              2. 同一元素的多次讀寫(xiě)

              3. 迭代器復(fù)制,記錄

              雙向

              1. 前向迭代器的所有操作

              2. 前后置自減

              隨機(jī)迭代器

              1. 雙向迭代器的所有操作 2)所有關(guān)系操作符

              1. 與整型數(shù)值運(yùn)算 4)迭代器減法

              5)下標(biāo)操作


              2010-11-9(晚上 類(lèi))

              1. 最簡(jiǎn)單地說(shuō),類(lèi)就是定義了一個(gè)新的類(lèi)型和一個(gè)新的作用域。

              2. 在類(lèi)內(nèi)部定義的函數(shù)默認(rèn)為inline.

              3. Const成員(函數(shù))不能改變其所操作的對(duì)象的數(shù)據(jù)成員。Const必須同時(shí)出現(xiàn)在聲明和定義中,若只出現(xiàn)在其中一處,就會(huì)出現(xiàn)一個(gè)編譯時(shí)錯(cuò)誤。

              4. 類(lèi)背后蘊(yùn)含的基本思想是數(shù)據(jù)抽象和封裝。數(shù)據(jù)抽象是一種依賴于接口和實(shí)現(xiàn)分離的編程(和設(shè)計(jì))技術(shù)。……封裝是一項(xiàng)將低層次的元素組合起來(lái)形成新的,高層次實(shí)體的技術(shù)。

              5. 在C++中,使用訪問(wèn)標(biāo)號(hào)來(lái)定義類(lèi)的抽象接口和實(shí)現(xiàn)封裝。……類(lèi)型的數(shù)據(jù)抽象視圖由其public成員定義。……private封裝了類(lèi)型的實(shí)現(xiàn)細(xì)節(jié)。

              6. 并非所有類(lèi)都必須是抽象的。……一些類(lèi),例如pair,確實(shí)沒(méi)有抽象接口。……盡管如此,這樣的類(lèi)型通常還是有成員函數(shù)的。

              7. 設(shè)計(jì)類(lèi)的接口是,設(shè)計(jì)者應(yīng)該考慮的是如何方便類(lèi)的使用;使用類(lèi)的時(shí)候,設(shè)計(jì)者就不應(yīng)該考慮類(lèi)如何工作。

              8. 在類(lèi)的外部定義inline的一個(gè)好處是可以使得類(lèi)比較容易閱讀。

              9. 不完全類(lèi)型只能用于定義指向該類(lèi)型的指針及引用,或者用于聲明(而不是定義)使用該類(lèi)型作為形參類(lèi)型或返回類(lèi)型的函數(shù)。

              10. 因?yàn)橹挥挟?dāng)類(lèi)定義體完成后才能定義類(lèi),因此類(lèi)不能具有自身類(lèi)型的數(shù)據(jù)成員。然后,只要類(lèi)名一出現(xiàn)就可以認(rèn)為該類(lèi)已聲明。因此,類(lèi)的數(shù)據(jù)成員可以是指向自身的指針或引用。

              11. 定義對(duì)象時(shí),將為其分配存儲(chǔ)空間,但(一般而言)定義類(lèi)型時(shí)不進(jìn)行存儲(chǔ)分配。


              未知時(shí)間(類(lèi))

              1. public的類(lèi)型別名雜類(lèi)體外使用需要作用域限定符;在類(lèi)體外成員函數(shù)定義中,出現(xiàn)成員名之后,不用限定符。

              2. Inline成員函數(shù)在類(lèi)體成員類(lèi)外聲明一次即可。類(lèi)體內(nèi)定義的成員函數(shù)默認(rèn)為inline。

              3. Const成員函數(shù)不能修改非mutable的數(shù)據(jù)成員。

              4. Const類(lèi)對(duì)象只能調(diào)用const成員函數(shù)。

              5. 成員函數(shù)可以返回本類(lèi)對(duì)象及引用,指針。返回對(duì)象時(shí)可以設(shè)定const屬性。

              6. 定義類(lèi)的時(shí)候不能具有自身類(lèi)型的數(shù)據(jù)成員,但可以是指向自身類(lèi)型的指針或引用。

              7. 一旦遇到右花括號(hào),類(lèi)的定義就結(jié)束了。


              未知時(shí)間(同上)

              1. const構(gòu)造函數(shù)是不必要的。

              2. 構(gòu)造函數(shù)的工作是初始化對(duì)象。

              3. 構(gòu)造函數(shù)初始化式只在構(gòu)造函數(shù)的定義中而不是聲明中指定。

              4. 從概念上講,可以認(rèn)為構(gòu)造函數(shù)分兩個(gè)階段執(zhí)行:(1)初始化階段;(2)普通的計(jì)算階段。

              5. 在構(gòu)造函數(shù)初始化列表中沒(méi)有顯示提及的每個(gè)成員,使用與初始化變量相同的規(guī)則來(lái)進(jìn)行初始化。運(yùn)行該類(lèi)型的默認(rèn)構(gòu)造函數(shù),來(lái)初始化類(lèi)類(lèi)型的數(shù)據(jù)成員。內(nèi)置或復(fù)合類(lèi)型的成員初始化值依賴于對(duì)象的作用域:在局部作用域中這些成員不被初始化,而在全局作用域中它們被初始化為0。

              6. 必須對(duì)任何const或引用類(lèi)型的成員以及沒(méi)有默認(rèn)構(gòu)造函數(shù)的類(lèi)類(lèi)型的任何成員使用初始化式。

              7. 構(gòu)造函數(shù)初始化列表僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員被初始化的次序就是定義成員的次序。

              8. 初始化的次序常常無(wú)關(guān)緊要。然而,如果一個(gè)成員是根據(jù)其他成員而初始化,則成員初始化的次序是至關(guān)重要的。

              9. 安裝與成員聲明一致的次序編寫(xiě)構(gòu)造函數(shù)初始化列表是個(gè)好主意。此外,盡可能避免使用成員來(lái)初始化其他成員。

              10. 初始化式可以是任意表達(dá)式。

              11. 只要定義一個(gè)對(duì)象時(shí)沒(méi)有提供初始化式,就使用默認(rèn)構(gòu)造函數(shù)。為所有形參提供默認(rèn)實(shí)參的構(gòu)造函數(shù)也定義了默認(rèn)構(gòu)造函數(shù)。

              12. 實(shí)際上,如果定義了其他構(gòu)造函數(shù),則提供一個(gè)默認(rèn)構(gòu)造函數(shù)幾乎總是對(duì)的。

              13. 可以用單個(gè)實(shí)參來(lái)調(diào)用的構(gòu)造函數(shù)定義了從形參類(lèi)型到該類(lèi)型的一個(gè)隱式轉(zhuǎn)換。

              14. 當(dāng)構(gòu)造函數(shù)被聲明為explicit時(shí),編譯器將不使用它作為轉(zhuǎn)換操作符。

              15. 任何構(gòu)造函數(shù)都可以用來(lái)顯示地創(chuàng)建臨時(shí)對(duì)象。

              16. 通常,除非有明顯的理由想要定義隱式轉(zhuǎn)換,否則,但形參構(gòu)造函數(shù)應(yīng)該為explicit。將構(gòu)造函數(shù)設(shè)置為explicit可以避免錯(cuò)誤,并且當(dāng)轉(zhuǎn)換有用時(shí),用戶可以顯示地構(gòu)造對(duì)象。

              17. 每個(gè)static數(shù)據(jù)成員是與類(lèi)關(guān)聯(lián)的對(duì)象,并不與該類(lèi)的對(duì)象相關(guān)聯(lián)。

              18. Static成員函數(shù)沒(méi)有this形參,它可以直接訪問(wèn)所屬類(lèi)的static數(shù)據(jù)成員,但不能直接使用非static成員。

              19. 因?yàn)閟tatic成員不是任何對(duì)象的組成部分,所以static成員函數(shù)不能被聲明為const。畢竟,將成員函數(shù)聲明為const就是承諾不會(huì)修改該函數(shù)所屬的對(duì)象。

              20. Static數(shù)據(jù)成員的類(lèi)型可以是該成員所屬的類(lèi)類(lèi)型。Static數(shù)據(jù)成員可用作默認(rèn)實(shí)參。

              21. 友元聲明將已命名的類(lèi)或非成員函數(shù)引入到外圍作用域中。用友元引入的類(lèi)名和函數(shù)(定義或聲明),可以像預(yù)先聲明一樣使用。



              ————————————————————————————————————————————————已打印———————————————————————————————————————————————————



              2010-11-26晚(復(fù)制控制)

              1,復(fù)制構(gòu)造函數(shù),賦值操作符和析構(gòu)函數(shù)總稱為復(fù)制控制。

              2,實(shí)現(xiàn)復(fù)制控制操作最困難的部分,往往在于識(shí)別何時(shí)需要覆蓋默認(rèn)版本。

              3,c++支持兩種初始化形式:直接初始化和復(fù)制初始化。

              4,合成復(fù)制構(gòu)造函數(shù)直接復(fù)制內(nèi)置類(lèi)型成員的值,類(lèi)類(lèi)型成員使用該類(lèi)的復(fù)制構(gòu)造函數(shù)進(jìn)行復(fù)制。數(shù)組成員的復(fù)制是個(gè)例外。雖然一般不能復(fù)制數(shù)組。但如果一個(gè)類(lèi)具有數(shù)組成員,則合成復(fù)制構(gòu)造函數(shù)將復(fù)制數(shù)組。

              5,為了防止復(fù)制,類(lèi)必須顯式聲明其復(fù)制構(gòu)造函數(shù)為private。想要連友元和成員中的復(fù)制也禁止,就可以聲明一個(gè)(private)復(fù)制構(gòu)造函數(shù)但不對(duì)其定義。

              6,通過(guò)聲明(但不定義)private復(fù)制構(gòu)造函數(shù),可以禁止任何復(fù)制類(lèi)類(lèi)型對(duì)象的嘗試:用戶代碼中的復(fù)制嘗試將在編譯時(shí)標(biāo)記為錯(cuò)誤。而成員函數(shù)和友元函數(shù)中的復(fù)制嘗試將在鏈接時(shí)導(dǎo)致錯(cuò)誤。

              7,如果定義了復(fù)制構(gòu)造函數(shù),也必須定義默認(rèn)構(gòu)造函數(shù)。

              8,實(shí)際上,應(yīng)將這兩個(gè)操作(復(fù)制和賦值)看做是一個(gè)單元。如果需要其中一個(gè),我們幾乎也可以肯定需要另一個(gè)。

              9,變量在超出作用域時(shí)應(yīng)該自動(dòng)撤銷(xiāo)……動(dòng)態(tài)分配的對(duì)象只有在指向該對(duì)象的指針被刪除時(shí)才撤銷(xiāo)。……撤銷(xiāo)一個(gè)容器(不管是標(biāo)準(zhǔn)庫(kù)容器還是內(nèi)置數(shù)組)時(shí),也會(huì)運(yùn)行容器中的類(lèi)類(lèi)型元素的析構(gòu)函數(shù))

              10,析構(gòu)函數(shù)通常用于釋放再構(gòu)造函數(shù)或在對(duì)象生命期內(nèi)獲取的資源。

              11,如果類(lèi)需要析構(gòu)函數(shù),則它也需要賦值操作符和復(fù)制構(gòu)造函數(shù),這是一個(gè)有用的經(jīng)驗(yàn)法則。這個(gè)規(guī)則常稱為三法則,指的是如果需要析構(gòu)函數(shù),則需要所有這三個(gè)復(fù)制控制成員。

              12,與復(fù)制構(gòu)造函數(shù)或賦值操作符不同,編譯器總是會(huì)為我們合成一個(gè)析構(gòu)函數(shù)。

              13,合成析構(gòu)函數(shù)并不刪除指針成員所指向的對(duì)象。

              14,析構(gòu)函數(shù)與復(fù)制構(gòu)造函數(shù)或賦值操作符之間的一個(gè)重要區(qū)別是,即使我們編寫(xiě)了自己的析構(gòu)函數(shù),合成析構(gòu)函數(shù)仍然運(yùn)行。

              15,復(fù)制控制的賦值操作符接收單個(gè)形參,且該形參是同一類(lèi)類(lèi)型對(duì)象。




              2011-4-4(中午)重載操作符與轉(zhuǎn)換

              1,用于內(nèi)置類(lèi)型的操作符,其含義不能改變。

              2,操作符的優(yōu)先級(jí),結(jié)合性或操作數(shù)數(shù)目不能改變。

              3,重載操作符并不保證操作數(shù)的求值順序。

              4,一般將算術(shù)和關(guān)系操作符頂以為非成員函數(shù),而將賦值操作符定義為成員。

              5,操作符定義為非成員函數(shù)時(shí),通常必須將他們?cè)O(shè)置為所操作類(lèi)的友元。

              6,重載逗號(hào),取地址,邏輯與,邏輯或等操作通常不是好做法。這些操作具有有用的內(nèi)置含義,如果定義了自己的版本,就不能再使用這些內(nèi)置含義。

              7,賦值,下標(biāo),調(diào)用(()),和成員訪問(wèn)箭頭等操作符必須定義為成員,將這些操作符定義為非成員函數(shù)將導(dǎo)致編譯時(shí)錯(cuò)誤。

              8,對(duì)稱的操作數(shù),如算術(shù)操作符,相等操作符,關(guān)系操作符和位操作符,最好定義為普通非成員函數(shù)。

              9,當(dāng)定義符合標(biāo)準(zhǔn)庫(kù)iostream規(guī)范的輸入或輸出操作符的時(shí)候,必須使它成為非成員操作符。

              10,與輸出操作符類(lèi)似,輸入操作符的第一個(gè)形參是一個(gè)引用,指向它要讀的流,并且返回的也是對(duì)同一個(gè)流的引用。它的第二個(gè)形參是對(duì)要讀入的對(duì)象的非const引用,該形參必須為非const,因?yàn)檩斎氩僮鞣哪康氖菍?shù)據(jù)讀到這個(gè)對(duì)象中。

              11,更重要但通常重視不夠的是,輸入和輸出操作符有如下區(qū)別:輸入操作符必須處理錯(cuò)誤和文件結(jié)束的可能性。

              12,設(shè)計(jì)輸入操作符時(shí),如果可能,要確定錯(cuò)誤恢復(fù)措施,這很重要。

              13,注意,為了與內(nèi)置操作符保持一致,加法返回一個(gè)右值,而不是一個(gè)引用。

              14,類(lèi)賦值操作符必須是類(lèi)的成員,以便編譯器可以知道是否需要合成一個(gè)。

              15,下標(biāo)操作符必須定義為類(lèi)成員函數(shù)。

              16,類(lèi)定義下標(biāo)操作符時(shí),一般需要定義兩個(gè)版本:一個(gè)為非const成員并返回引用,另一個(gè)為const成員并返回const引用。

              17,箭頭操作符必須定義為類(lèi)成員函數(shù)。解引用操作符不要求定義為成員,但將它作為成員一般也是正確的。

              18,重載箭頭操作符必須返回指向類(lèi)類(lèi)型的指針,或者返回定義了自己的箭頭操作符的類(lèi)類(lèi)型對(duì)象。

              19,C++語(yǔ)言不要求自增操作符或自減操作符一定作為類(lèi)的成員,但是,因?yàn)檫@些操作符改變對(duì)象的狀態(tài),所以更傾向于將它們作為成員。

              20,為了與內(nèi)置類(lèi)型一致,前綴式操作符應(yīng)返回被增量或減量對(duì)象的引用。

              21,后綴式操作符函數(shù)接受一個(gè)額外的(即無(wú)用的)int型形參。

              22,為了與內(nèi)置操作符一致,后綴式操作符應(yīng)返回舊值,并且,應(yīng)作為值返回,而不是返回引用。

              23,如果想要使用函數(shù)調(diào)用來(lái)調(diào)用后綴式操作符,必須給出一個(gè)整型實(shí)參值。

              ps:做這些筆記的時(shí)候是一年前多了。當(dāng)時(shí)還在做著ACM,學(xué)這些似乎只是抱著充實(shí)自己的心態(tài),當(dāng)時(shí)最想的似乎就是看完整本書(shū),但最終還是在面向?qū)ο蟮牟糠滞O聛?lái)了。現(xiàn)在很多東西都忘了,畢竟這樣學(xué)而沒(méi)有實(shí)際使用,肯定很容易忘的。可能當(dāng)時(shí)也是出現(xiàn)了這么個(gè)想法而停下來(lái)的吧,至少應(yīng)該是其中一個(gè)原因。這份筆記似乎在硬盤(pán)里丟失過(guò)一次,最后在金山快盤(pán)里找回來(lái)的。2011-12-4

               

            国内精品久久久久| 久久精品国产99国产精偷| 99久久精品免费观看国产| 2021少妇久久久久久久久久| 国产精品久久久久久影院| 国内精品久久久久久中文字幕| 香蕉久久久久久狠狠色| 国产精品免费福利久久| 亚洲国产成人久久笫一页 | 99久久久国产精品免费无卡顿| 色噜噜狠狠先锋影音久久| 免费精品久久久久久中文字幕| 久久久久久伊人高潮影院 | 99久久精品九九亚洲精品| 久久人人爽人人爽人人片AV不| 久久青草国产精品一区| 天天躁日日躁狠狠久久| 久久精品一本到99热免费| 欧美综合天天夜夜久久| 亚洲国产美女精品久久久久∴ | 久久久久亚洲AV无码专区网站| 亚洲狠狠婷婷综合久久久久 | 久久久久久一区国产精品| 久久国产精品99久久久久久老狼 | 人妻无码αv中文字幕久久琪琪布| 久久91精品国产91久| 久久久久青草线蕉综合超碰| 一本大道久久东京热无码AV | 久久久无码精品亚洲日韩按摩 | 久久国产欧美日韩精品| 日本欧美国产精品第一页久久| 久久久久综合中文字幕| 久久久精品波多野结衣| 久久99精品国产麻豆不卡| 99久久精品无码一区二区毛片| 一本久久久久久久| 91精品无码久久久久久五月天| 久久综合综合久久97色| 国内精品久久久久国产盗摄| 久久99精品久久久久久齐齐| 久久精品国产72国产精福利|