• <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

            我是一只菜菜菜菜鳥...
            posts - 61, comments - 56, trackbacks - 0, articles - 34

            《C++ Primer 中文版》筆記

            Posted on 2011-12-04 14:12 Onway 閱讀(715) 評論(0)  編輯 收藏 引用 所屬分類: 使用說明

            變量

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

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

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

            函數(shù)

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

            2. 如果局部地聲明一個同名函數(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)用來區(qū)分名字的不同意義的上下文稱為作用域。名字的作用域指的是知道該名字的程序文本區(qū)。

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

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

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

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

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

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

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

            Const對象

            1)const變量默認是文件的局部變量。

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

            4)由于編譯時的替換,在運行時不會有任何存儲空間存儲常量表達式初始化的const變量。

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

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

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

            2. const引用與指向const的引用是同一個意思

            3. 非const引用不能指向const對象。

            4. const引用可以指向非const對象。

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

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

            預(yù)處理器

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

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

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

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

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

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

            頭文件

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

            2. 因為頭文件包含在多個源文件中,所以不應(yīng)該含有變量或函數(shù)的定義。

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

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

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

            2010-10-14

            1. 標(biāo)準庫定義了四個IO對象,分別是cin,cout,cerr,clog.

            2. c++成對注釋是從C繼承過來的。

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

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

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

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

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


            2010-10-16

            1. 標(biāo)準庫類型不允許做復(fù)制或是賦值操作

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

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

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

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

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

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

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

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

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


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

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

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

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

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

            a,元素類型必須支持賦值運算。

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

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

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

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

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

            5. 在指定容器元素為容器類型時,必須如下(兩個同向尖括號之間)使用空格。

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

            b,執(zhí)行容器元素的隨機訪問的代價

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

            1. ……因為他們實現(xiàn)相同的操作,所以稱之為“算法”;而“泛型”指的是它們可以操作在多種容器類型上……

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

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

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

            5. 理解算法的最基本方法是了解該算法是否讀元素,寫元素或者對元素進行重新排序。

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

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

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

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

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

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

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

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


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

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

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

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

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

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

            6. 向算法傳遞無效的迭代器類別所引起的錯誤,無法保證會在編譯時被捕獲到。

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

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

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

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

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

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

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

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

              輸入迭代器

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

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

              輸出迭代器

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

              (對迭代器值要求恰好寫入一次)

              前向迭代器

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

              2. 同一元素的多次讀寫

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

              雙向

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

              2. 前后置自減

              隨機迭代器

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

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

              5)下標(biāo)操作


              2010-11-9(晚上 類)

              1. 最簡單地說,類就是定義了一個新的類型和一個新的作用域。

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

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

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

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

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

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

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

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

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

              11. 定義對象時,將為其分配存儲空間,但(一般而言)定義類型時不進行存儲分配。


              未知時間(類)

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

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

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

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

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

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

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


              未知時間(同上)

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

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

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

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

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

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

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

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

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

              10. 初始化式可以是任意表達式。

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

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

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

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

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

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

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

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

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

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

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



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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

              10,與輸出操作符類似,輸入操作符的第一個形參是一個引用,指向它要讀的流,并且返回的也是對同一個流的引用。它的第二個形參是對要讀入的對象的非const引用,該形參必須為非const,因為輸入操作符的目的是將數(shù)據(jù)讀到這個對象中。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

               

            精品久久久久久久无码| 久久中文骚妇内射| 人妻丰满AV无码久久不卡| 久久精品国产黑森林| 国产精品久久99| 国产精品免费久久| 久久露脸国产精品| 91麻豆国产精品91久久久| 午夜精品久久久久久影视777| 亚洲婷婷国产精品电影人久久| 亚洲欧美国产日韩综合久久 | 久久精品a亚洲国产v高清不卡| 久久综合狠狠综合久久综合88| 久久精品国产2020| 精品久久久久久综合日本| 精品久久久久久无码中文字幕| 久久亚洲精品国产精品婷婷| 精品熟女少妇a∨免费久久| 精品综合久久久久久888蜜芽| 2021精品国产综合久久| 93精91精品国产综合久久香蕉| 一本一道久久a久久精品综合 | 伊人久久大香线蕉综合网站 | 久久久久人妻一区二区三区 | 精品久久香蕉国产线看观看亚洲| 99久久99久久| 久久久精品久久久久久| 久久无码AV中文出轨人妻| 久久精品中文字幕无码绿巨人| 久久九九全国免费| 久久国产免费观看精品3| 97精品伊人久久久大香线蕉| 久久91精品国产91| 99久久精品国产麻豆| 欧美国产成人久久精品| 久久无码人妻一区二区三区午夜| 亚洲精品国产成人99久久| 久久精品国产2020| 精品人妻伦一二三区久久| 午夜精品久久久久久99热| 亚洲av日韩精品久久久久久a|