變量
可以通過extern關鍵字聲明變量而不定義它。
如果聲明有初始化式,那么它被當做是定義。
只有當extern聲明位于函數外部時,才可以含有初始化式。
函數
帶默認參數的函數,聲明與定義誰在前誰給出默認值。
如果局部地聲明一個同名函數,則該函數將屏蔽而不是重載在外層作用域聲明的同名函數。
指針
1)int a[3][4];a==&a[0];a[0]==&a[0][0];
a[0]==*(a+0) *(a[0]+1)==*(*(a+0)+1)==a[0][1];
在二維數組中,a[0]不是值,是地址。
a[i][j]==*(*(a+i)+j);
名字作用域
1)用來區分名字的不同意義的上下文稱為作用域。名字的作用域指的是知道該名字的程序文本區。
2)一個名稱可以和不同作用域的不同實體相關聯。
3)定義在所有函數外部的名字具有全局作用域。
4)定義在函數內部的名字具有局部作用域。
定義在語句中的名字具有局域作用域。
可以將一個非const變量定義在一個文件中,在另外的文件中,只要做了合適的聲明,就可以使用該變量。
7)在全局作用域聲明的const變量是定義該對象的文件的局部變量。
8)非const變量默認為extern,要使const變量能夠在其他的文件中訪問,必須顯式指定為extern.
Const對象
1)const變量默認是文件的局部變量。
2)在頭文件定義const變量,任何包含該頭文件的源文件都不會出現重定義的情況,原因是const變量默認是文件作用域。這樣出現的結果是每個源文件都定義了自己的const變量。
4)由于編譯時的替換,在運行時不會有任何存儲空間存儲常量表達式初始化的const變量。
5)如果const變量不是用常量表達式初始化,那么它就不應該在頭文件定義。相反,和其他的變量一樣,該const變量應在源文件定義并初始化。應在頭文件為它添加extern聲明,以別其他文件共享。
6)2010-11-3(下午,const引用)
引用不能改變指向,且必須初始化才能使用
const引用與指向const的引用是同一個意思
非const引用不能指向const對象。
const引用可以指向非const對象。
const引用可以指向相關類型或是右值。
const引用只能讀取,不能通過const引用改變其所指向對象的值。
預處理器
1)#include設施是C++預處理器的一部分。
2)預處理器處理程序源碼在編譯器之前運行。
3)設計頭文件是,我們必須保證多次包含同一頭文件不會引起該頭文件定義的類和對象被多次定義。
4)預處理器允許我們自定義變量,預處理器變量的名字在程序中必須是唯一的。任何與預處理器變量相匹配的名字的使用都關聯到該預處理器變量。
5)預處理器變量有兩種狀態:已定義和未定義。定義預處理器變量和檢測器狀態所用的預處理器指示不同。
6)頭文件應該含有保護符,即使這些頭文件不會被其他頭文件包含。編寫頭文件保護符不難,而且如果頭文件被包含多次,它可以避免難以理解的編譯錯誤。
頭文件
頭文件一般包含類的定義,extern變量的聲明和函數的聲明。
因為頭文件包含在多個源文件中,所以不應該含有變量或函數的定義。
對于頭文件不應該含有定義這一規則,有三個例外。頭文件可以定義類,值在編譯時就已知的const對象和inline函數。這些實體可在多個源文件中定義,只要每個源文件中的定義是相同的。
類,const對象,inline函數是具有文件作用域。
5. typedef不是定義也不是聲明,是一個編譯前的預處理。具有文件作用域。
2010-10-14
標準庫定義了四個IO對象,分別是cin,cout,cerr,clog.
c++成對注釋是從C繼承過來的。
wchar_t是內置類型,用于擴展字符集,比如漢字和日語,這些字符集中的一些字符不能用單個char表示。
轉義字符沒有十進制數字形式,\ooo表示八進制表示轉義,\xooo表示十六進制表示。
操作符的替代名用于支持某些不支持標準C++操作符集的字符集,不能用作變量標識符。
標識符不能包含兩個連續下劃線,不能下劃線開頭緊跟一個大寫字母,在函數外定義的標識符不能以下劃線開頭。
定義用于分配空間,指定初始值;定義包含了聲明;extern用于聲明。
2010-10-16
標準庫類型不允許做復制或是賦值操作
只有支持復制的元素類型才可以存儲在vector或其他容器類型里。
形參或返回類型不能為流類型。如需傳遞或返回IO對象,則必須使用指針或引用。
如果一個流調用tie函數將其本身綁在傳遞給tie的ostream實參對象上,則該流上的任何IO操作都會刷新實參所關聯的緩沖區。如果在調用tie函數時傳遞實參“0”,則打破改流上已存在的捆綁。
由于歷史原因,IO標準庫使用C風格字符串,而不是C++ string類型作為文件名。
對于用ofstream打開的文件,要保存文件中已存在的數據,唯一的方法是顯示指定app模式打開。
string類型轉C風格字符串用c_str成員函數。
逗號操作符的求解過程:首先計算它的每一個操作數,然后返回最右邊操作數作為整個操作的結果。
每個IO對象管理一個緩沖區,用于存儲程序讀寫的數據。
要使用標準庫定義的字符串流,必須包含頭文件sstream。
2010-10-23 (第九章,容器和算法)
這些容器類型的差別在于他們提供哪些操作,但是如果兩個容器提供了相同的操作,則他們的接口(函數名字和參數個數)應該相同。
所有的容器都是類模板。所有的容器類型都定義了默認構造函數,由于創建指定的容器對象。
不提供元素初始化式時,標準庫將為該容器實現值初始化。采用這種類型的初始化,元素類型必須是內置或復合類型,或者是提供了默認構造函數的類類型。如果元素類型沒有默認構造函數,則必須顯示指定其元素初始化式。
容器元素類型必須滿足以下兩個(最低限度的)約束:
a,元素類型必須支持賦值運算。
b,元素類型的對象必須可以復制。
除了引用類型外,所有內置或是復合類型都可以用做元素類型。引用不支持一般意義的賦值運算,因此沒有元素是引用類型的容器。
除輸入輸出標準庫類型之外,所有其他標準庫類型都是有效地容器元素類型。特別地,容器本身也滿足上述要求,因此,可以定義元素本身就是容器類型的容器。
此外,一些容器操作對元素類型還有特殊要求。如果元素類型不支持這些特殊要求,則相關的容器操作就不能執行:我們可以定義該類型的容器,單不能使用某些特定的操作。
其中一種需外加類型要求的容器操作是指定容器大小并提供單個初始化式的構造函數。如果容器存儲類類型的對象,那么只有當其元素類型提供默認構造函數時,容器才能使用這種構造函數。
在指定容器元素為容器類型時,必須如下(兩個同向尖括號之間)使用空格。
每種容器類型都提供若干共同工作的迭代器類型。與容器類型一樣,所有迭代器具有相同的接口:如果某種迭代器支持某種操作,那么支持這種操作的其他迭代器也會以相同的方式支持這種操作。
無法檢查迭代器是否有效,也無法通過測試來發現迭代器是否已經失效。任何無效迭代器的使用都可能導致運行時錯誤,單程序不一定崩潰,否則檢查這種錯誤也許會容易些。
簡單地說,逆序迭代器從后向前遍歷容器,并反轉了某些相關的迭代器操作:例如,在逆序迭代器上做++運算將指向容器中的前一個元素。
所有的容器類型都支持用關系操作符來實現兩個容器的比較。
容器的比較是基于容器內元素的比較,容器的比較使用了元素類型定義的同一個關系操作符……。
2010-10-24早 (續上)
對于所有的容器類型,如果resize操作壓縮了容器,則指向已刪除的元素的迭代器失效。
使用下標運算的另一個可選方案是at成員函數。這個函數的行為和下標運算相似,但是如果給出的下標無效,at函數將會拋出out_of_range異常。
與賦值相關的操作符都作用于整個容器。……賦值后,左右兩邊的容器相等:盡管賦值前兩個容器的長度可能不相等,但賦值后兩個容器都具有右操作數的長度。
完成swap操作后,盡管被交換的元素已經存放在另一容器中,但迭代器仍然指向相同的元素。
如果在不同(或相同)類型的容器內,元素類型不相同但是互相兼容,則其賦值運算必須使用assign函數。
帶有一對迭代器參數的assign操作允許我們將一個容器的元素賦給另一個不同類型的容器。
swap操作實現交換兩個容器內所有元素的功能。要交換的容器的類型必須匹配:操作數必須是相同類型的容器,而且所存儲的元素類型也必須相同。
capacity操作獲取在容器需要分配更多的存儲空間之前能夠存儲的元素總數,而reserve操作則告訴vector容器應該預留多少個元素的存儲空間。
每當vector容器不得不分配新額存儲空間時,以加倍當前容量的分配策略實現重新分配。
元素是否連續存儲還會顯著地影響:
a,在容器的中間位置添加或刪除元素的代價
b,執行容器元素的隨機訪問的代價
通常來說,除非找到選擇使用其他容器的更好理由,否則vector容器都是最佳選擇。
本質上,適配器是使一事物的行為類似于另一事物的行為的一種機制。容器適配器讓一種已存在的容器類型采用另一種不同德抽象類型的工作方式實現。
所有容器適配器都根據其基礎容器類型所支持的操作來定義自己的操作。
2010-10-31下午(第十章 關聯容器)
關聯容器和順序容器的本質區別在于:關聯容器通過鍵(key)存儲和讀取元素,而順序容器則通過元素在容器的位置順序存儲和訪問元素。
set和map類型的對象所包含的元素都具有不同的鍵,不允許為同一個鍵添加第二個元素。
如果在創建pair對象時不提供初始化式,則調用默認構造函數對其成員采用值初始化。
在使用關聯容器時,它的鍵不但有一個類型,而且還有一個相關的比較函數。……所用的比較函數必須在建類型上定義嚴格弱排序。……對于兩個鍵,如果它們互相之間都不存在“小于”關系,則容器將之視為相同的鍵。
在學習map的接口時,需謹記value_type是pair類型,它的值成員可以修改,但鍵成員不能修改。
用下標訪問不存在的元素將導致在map容器中添加一個新的元素,它的鍵即為該下標值。
map迭代器返回value_type類型的值——包含const key_type和mapped_type類型成員的pair對象;下標操作則返回一個mapped_type類型的值。
插入單個元素的insert版本使用鍵值pair類型的參數。類似的,對于參數為一對迭代器的版本,迭代器必須指向鍵值pair類型的元素。
如果試圖插入的元素所對應的鍵已在容器中,則inset將不再做任何操作。
使用下標存在一個很危險的副作用:如果該鍵不再map容器中,那么下標操作會插入一個具有該鍵的新元素。
當然,在執行count后再適用下標操作,實際上是對元素作了兩次查找。如果希望當元素存在時就使用它,則應該用find操作。
當只想知道一個值是否存在時,使用set容器是最適合的。
set不支持下標操作符,而且沒有定義mapped_type類型。在set容器中,value_type不是pair類型,而是與key_type相同的類型。它們指的都是set中存儲的元素類型。
與map容器的操作一樣,帶有一個鍵參數的insert返回pair類型對象,包含一個迭代器和一個bool值,迭代器指向擁有改建的元素,而bool值表明是否添加了元素。使用迭代器對的insert版本返回void類型。
由于鍵不要求是唯一的,因此每次調用insert總會添加一個元素。
在multimap和multiset容器中,如果某個鍵對應多個實例,則這些實例在容器中將相鄰存放。lower_bound返回的迭代器不一定指向擁有特定鍵的元素。如果改鍵不在容器中,則lower_bound返回在保持容器元素順序的前提下該鍵應被插入第一個位置。
2010-11-4(下午,泛型算法)
……因為他們實現相同的操作,所以稱之為“算法”;而“泛型”指的是它們可以操作在多種容器類型上……
類似地,由于指針的行為與作用在內置數組上的迭代器一樣,因此也可以使用find來搜索數組……
泛型算法本身從不執行容器操作,只是單獨依賴迭代器和迭代器操作實現。算法基于迭代器及其操作實現,而并非基于容器操作。這個事實也許比較意外,但本質上暗示了:使用“普通”的迭代器時,算法從不修改基礎容器的大小。正如我們所看到的,算法也許會改變存儲在容器的元素的值,也許會在容器內移動元素,但是,算法從不直接添加或刪除元素。
除了少數例外情況,所有算法都在一段范圍內的元素上操作,我們將這段范圍稱為“輸入范圍(input range)”。帶有輸入范圍參數的算法總是使用頭兩個形參標記該范圍。
理解算法的最基本方法是了解該算法是否讀元素,寫元素或者對元素進行重新排序。
通常,泛型算法都是在標記容器(或其他序列)內的元素范圍的迭代器上操作的。標記范圍的兩個實參類型必須精確匹配,而迭代器本身必須標記一個范圍:它們必須指向同一個容器中的元素(或者超出容器的下一位置),并且如果兩者不相等,則第一個迭代器通過不斷地自增,必須可以到達第二個迭代器。
有些算法直接將數據寫到輸入序列,另外一些則帶有一個額外的迭代器參數指定寫入目標。這類算法將目標迭代器用作輸出的位置。還有第三種算法將指定數目的元素寫入某個序列。
對指定數目的元素寫入運算,或者寫入目標迭代器的算法,都不檢查目標的大小是否足以存儲要寫入的元素。
通常,用迭代器給容器元素賦值時,被賦值的是迭代器所指向的元素。而使用插入迭代器賦值時,則會在容器中添加一個新元素,其值等于賦值運算的右操作數的值。
謂詞是做某些檢測的函數,返回用于條件判斷的類型,指出條件是否成立。
標準庫所定義的迭代器不依賴于特定的容器。事實上,C++語言還提供了另外三種迭代器:(1)插入迭代器(2)iostream迭代器(3)反向迭代器。
流迭代器只定義了最基本的迭代器操作:自增,解引用和賦值。此外,可比較兩個istream迭代器是否相等(或不等)。而ostream迭代器則不提供比較運算。
流迭代器都是類模板:任何已定義輸入操作符(>>操作符)的類型都可以定義istream_iterator。類似地,任何已定義輸出操作符(<<操作符)的類型也可以定義ostream_iterator.
2010-11-7(續上)
由于不能反向遍歷流,因此流迭代器不能創建反向迭代器。
使用普通的迭代器對反向迭代器進行初始化或賦值時,所得到的迭代器并不是指向原迭代器所指向的元素。
迭代器可根據所提供的操作集進行分類。
所有標準庫容器提供的迭代器都至少達到雙向迭代器的要求。
C++標準為所有泛型和算術算法的每一個迭代器形參指定了范圍最小的迭代器種類。
向算法傳遞無效的迭代器類別所引起的錯誤,無法保證會在編譯時被捕獲到。
算法最基本的性質是需要使用的迭代器種類。所有算法都指定了它的每個迭代器形參可使用的迭代器類型。
盡管幾乎所有算法都有輸入范圍,但算法是否使用其他形參取決于它所執行的操作。
如果dest是容器上的迭代器,則算法將輸出內容寫到容器中已存在的元素上。更普遍的用法是,將dest與某個插入迭代器或者ostream_iterator綁定在一起。
帶有beg2而不帶end2的算法將beg2視為第二個輸入范圍的首元素,但沒有指定該范圍最后一個元素。這些算法假定以beg2開始的范圍至少與beg和end指定的范圍一樣大。
標準庫為這些算法提供另外命名的版本,而非重載版本,其原因在于這兩種版本的算法帶有相同數目的形參。……此時,如果使用重載版本,則可能導致二義性,盡管這個可能出現的幾率很低。
對于list對象,應該優先使用list容器特有的成員版本,而不是泛型算法。
List容器特有的算法與其泛型算法之間有兩個至關重要的差別。其中一個是remove和unique的list版本修改了其關聯的基礎容器……另一個差別是list容器提供的merge和splice運算會破壞它們的實參。
14. 習題11.23,五種迭代器各自支持的操作。輸入迭代器
相等與不等 2)前后置自增
3)右操作數解引用 4)箭頭操作符
輸出迭代器
前后置自增 2)左操作數解引用
(對迭代器值要求恰好寫入一次)
前向迭代器
所有輸入輸出迭代器的操作
同一元素的多次讀寫
迭代器復制,記錄
雙向
前向迭代器的所有操作
前后置自減
隨機迭代器
雙向迭代器的所有操作 2)所有關系操作符
與整型數值運算 4)迭代器減法
5)下標操作
2010-11-9(晚上 類)
最簡單地說,類就是定義了一個新的類型和一個新的作用域。
在類內部定義的函數默認為inline.
Const成員(函數)不能改變其所操作的對象的數據成員。Const必須同時出現在聲明和定義中,若只出現在其中一處,就會出現一個編譯時錯誤。
類背后蘊含的基本思想是數據抽象和封裝。數據抽象是一種依賴于接口和實現分離的編程(和設計)技術。……封裝是一項將低層次的元素組合起來形成新的,高層次實體的技術。
在C++中,使用訪問標號來定義類的抽象接口和實現封裝。……類型的數據抽象視圖由其public成員定義。……private封裝了類型的實現細節。
并非所有類都必須是抽象的。……一些類,例如pair,確實沒有抽象接口。……盡管如此,這樣的類型通常還是有成員函數的。
設計類的接口是,設計者應該考慮的是如何方便類的使用;使用類的時候,設計者就不應該考慮類如何工作。
在類的外部定義inline的一個好處是可以使得類比較容易閱讀。
不完全類型只能用于定義指向該類型的指針及引用,或者用于聲明(而不是定義)使用該類型作為形參類型或返回類型的函數。
因為只有當類定義體完成后才能定義類,因此類不能具有自身類型的數據成員。然后,只要類名一出現就可以認為該類已聲明。因此,類的數據成員可以是指向自身的指針或引用。
定義對象時,將為其分配存儲空間,但(一般而言)定義類型時不進行存儲分配。
未知時間(類)
public的類型別名雜類體外使用需要作用域限定符;在類體外成員函數定義中,出現成員名之后,不用限定符。
Inline成員函數在類體成員類外聲明一次即可。類體內定義的成員函數默認為inline。
Const成員函數不能修改非mutable的數據成員。
Const類對象只能調用const成員函數。
成員函數可以返回本類對象及引用,指針。返回對象時可以設定const屬性。
定義類的時候不能具有自身類型的數據成員,但可以是指向自身類型的指針或引用。
一旦遇到右花括號,類的定義就結束了。
未知時間(同上)
const構造函數是不必要的。
構造函數的工作是初始化對象。
構造函數初始化式只在構造函數的定義中而不是聲明中指定。
從概念上講,可以認為構造函數分兩個階段執行:(1)初始化階段;(2)普通的計算階段。
在構造函數初始化列表中沒有顯示提及的每個成員,使用與初始化變量相同的規則來進行初始化。運行該類型的默認構造函數,來初始化類類型的數據成員。內置或復合類型的成員初始化值依賴于對象的作用域:在局部作用域中這些成員不被初始化,而在全局作用域中它們被初始化為0。
必須對任何const或引用類型的成員以及沒有默認構造函數的類類型的任何成員使用初始化式。
構造函數初始化列表僅指定用于初始化成員的值,并不指定這些初始化執行的次序。成員被初始化的次序就是定義成員的次序。
初始化的次序常常無關緊要。然而,如果一個成員是根據其他成員而初始化,則成員初始化的次序是至關重要的。
安裝與成員聲明一致的次序編寫構造函數初始化列表是個好主意。此外,盡可能避免使用成員來初始化其他成員。
初始化式可以是任意表達式。
只要定義一個對象時沒有提供初始化式,就使用默認構造函數。為所有形參提供默認實參的構造函數也定義了默認構造函數。
實際上,如果定義了其他構造函數,則提供一個默認構造函數幾乎總是對的。
可以用單個實參來調用的構造函數定義了從形參類型到該類型的一個隱式轉換。
當構造函數被聲明為explicit時,編譯器將不使用它作為轉換操作符。
任何構造函數都可以用來顯示地創建臨時對象。
通常,除非有明顯的理由想要定義隱式轉換,否則,但形參構造函數應該為explicit。將構造函數設置為explicit可以避免錯誤,并且當轉換有用時,用戶可以顯示地構造對象。
每個static數據成員是與類關聯的對象,并不與該類的對象相關聯。
Static成員函數沒有this形參,它可以直接訪問所屬類的static數據成員,但不能直接使用非static成員。
因為static成員不是任何對象的組成部分,所以static成員函數不能被聲明為const。畢竟,將成員函數聲明為const就是承諾不會修改該函數所屬的對象。
Static數據成員的類型可以是該成員所屬的類類型。Static數據成員可用作默認實參。
友元聲明將已命名的類或非成員函數引入到外圍作用域中。用友元引入的類名和函數(定義或聲明),可以像預先聲明一樣使用。
————————————————————————————————————————————————已打印———————————————————————————————————————————————————
2010-11-26晚(復制控制)
1,復制構造函數,賦值操作符和析構函數總稱為復制控制。
2,實現復制控制操作最困難的部分,往往在于識別何時需要覆蓋默認版本。
3,c++支持兩種初始化形式:直接初始化和復制初始化。
4,合成復制構造函數直接復制內置類型成員的值,類類型成員使用該類的復制構造函數進行復制。數組成員的復制是個例外。雖然一般不能復制數組。但如果一個類具有數組成員,則合成復制構造函數將復制數組。
5,為了防止復制,類必須顯式聲明其復制構造函數為private。想要連友元和成員中的復制也禁止,就可以聲明一個(private)復制構造函數但不對其定義。
6,通過聲明(但不定義)private復制構造函數,可以禁止任何復制類類型對象的嘗試:用戶代碼中的復制嘗試將在編譯時標記為錯誤。而成員函數和友元函數中的復制嘗試將在鏈接時導致錯誤。
7,如果定義了復制構造函數,也必須定義默認構造函數。
8,實際上,應將這兩個操作(復制和賦值)看做是一個單元。如果需要其中一個,我們幾乎也可以肯定需要另一個。
9,變量在超出作用域時應該自動撤銷……動態分配的對象只有在指向該對象的指針被刪除時才撤銷。……撤銷一個容器(不管是標準庫容器還是內置數組)時,也會運行容器中的類類型元素的析構函數)
10,析構函數通常用于釋放再構造函數或在對象生命期內獲取的資源。
11,如果類需要析構函數,則它也需要賦值操作符和復制構造函數,這是一個有用的經驗法則。這個規則常稱為三法則,指的是如果需要析構函數,則需要所有這三個復制控制成員。
12,與復制構造函數或賦值操作符不同,編譯器總是會為我們合成一個析構函數。
13,合成析構函數并不刪除指針成員所指向的對象。
14,析構函數與復制構造函數或賦值操作符之間的一個重要區別是,即使我們編寫了自己的析構函數,合成析構函數仍然運行。
15,復制控制的賦值操作符接收單個形參,且該形參是同一類類型對象。
2011-4-4(中午)重載操作符與轉換
1,用于內置類型的操作符,其含義不能改變。
2,操作符的優先級,結合性或操作數數目不能改變。
3,重載操作符并不保證操作數的求值順序。
4,一般將算術和關系操作符頂以為非成員函數,而將賦值操作符定義為成員。
5,操作符定義為非成員函數時,通常必須將他們設置為所操作類的友元。
6,重載逗號,取地址,邏輯與,邏輯或等操作通常不是好做法。這些操作具有有用的內置含義,如果定義了自己的版本,就不能再使用這些內置含義。
7,賦值,下標,調用(()),和成員訪問箭頭等操作符必須定義為成員,將這些操作符定義為非成員函數將導致編譯時錯誤。
8,對稱的操作數,如算術操作符,相等操作符,關系操作符和位操作符,最好定義為普通非成員函數。
9,當定義符合標準庫iostream規范的輸入或輸出操作符的時候,必須使它成為非成員操作符。
10,與輸出操作符類似,輸入操作符的第一個形參是一個引用,指向它要讀的流,并且返回的也是對同一個流的引用。它的第二個形參是對要讀入的對象的非const引用,該形參必須為非const,因為輸入操作符的目的是將數據讀到這個對象中。
11,更重要但通常重視不夠的是,輸入和輸出操作符有如下區別:輸入操作符必須處理錯誤和文件結束的可能性。
12,設計輸入操作符時,如果可能,要確定錯誤恢復措施,這很重要。
13,注意,為了與內置操作符保持一致,加法返回一個右值,而不是一個引用。
14,類賦值操作符必須是類的成員,以便編譯器可以知道是否需要合成一個。
15,下標操作符必須定義為類成員函數。
16,類定義下標操作符時,一般需要定義兩個版本:一個為非const成員并返回引用,另一個為const成員并返回const引用。
17,箭頭操作符必須定義為類成員函數。解引用操作符不要求定義為成員,但將它作為成員一般也是正確的。
18,重載箭頭操作符必須返回指向類類型的指針,或者返回定義了自己的箭頭操作符的類類型對象。
19,C++語言不要求自增操作符或自減操作符一定作為類的成員,但是,因為這些操作符改變對象的狀態,所以更傾向于將它們作為成員。
20,為了與內置類型一致,前綴式操作符應返回被增量或減量對象的引用。
21,后綴式操作符函數接受一個額外的(即無用的)int型形參。
22,為了與內置操作符一致,后綴式操作符應返回舊值,并且,應作為值返回,而不是返回引用。
23,如果想要使用函數調用來調用后綴式操作符,必須給出一個整型實參值。
ps:做這些筆記的時候是一年前多了。當時還在做著ACM,學這些似乎只是抱著充實自己的心態,當時最想的似乎就是看完整本書,但最終還是在面向對象的部分停下來了。現在很多東西都忘了,畢竟這樣學而沒有實際使用,肯定很容易忘的。可能當時也是出現了這么個想法而停下來的吧,至少應該是其中一個原因。這份筆記似乎在硬盤里丟失過一次,最后在金山快盤里找回來的。2011-12-4

