2010-11-9(晚上 類)
最簡單地說,類就是定義了一個新的類型和一個新的作用域。
在類內(nèi)部定義的函數(shù)默認為inline.
Const成員(函數(shù))不能改變其所操作的對象的數(shù)據(jù)成員。Const必須同時出現(xiàn)在聲明和定義中,若只出現(xiàn)在其中一處,就會出現(xiàn)一個編譯時錯誤。
類背后蘊含的基本思想是數(shù)據(jù)抽象和封裝。數(shù)據(jù)抽象是一種依賴于接口和實現(xiàn)分離的編程(和設(shè)計)技術(shù)。……封裝是一項將低層次的元素組合起來形成新的,高層次實體的技術(shù)。
在C++中,使用訪問標(biāo)號來定義類的抽象接口和實現(xiàn)封裝。……類型的數(shù)據(jù)抽象視圖由其public成員定義。……private封裝了類型的實現(xiàn)細節(jié)。
并非所有類都必須是抽象的。……一些類,例如pair,確實沒有抽象接口。……盡管如此,這樣的類型通常還是有成員函數(shù)的。
設(shè)計類的接口是,設(shè)計者應(yīng)該考慮的是如何方便類的使用;使用類的時候,設(shè)計者就不應(yīng)該考慮類如何工作。
在類的外部定義inline的一個好處是可以使得類比較容易閱讀。
不完全類型只能用于定義指向該類型的指針及引用,或者用于聲明(而不是定義)使用該類型作為形參類型或返回類型的函數(shù)。
因為只有當(dāng)類定義體完成后才能定義類,因此類不能具有自身類型的數(shù)據(jù)成員。然后,只要類名一出現(xiàn)就可以認為該類已聲明。因此,類的數(shù)據(jù)成員可以是指向自身的指針或引用。
定義對象時,將為其分配存儲空間,但(一般而言)定義類型時不進行存儲分配。
未知時間(類)
public的類型別名雜類體外使用需要作用域限定符;在類體外成員函數(shù)定義中,出現(xiàn)成員名之后,不用限定符。
Inline成員函數(shù)在類體成員類外聲明一次即可。類體內(nèi)定義的成員函數(shù)默認為inline。
Const成員函數(shù)不能修改非mutable的數(shù)據(jù)成員。
Const類對象只能調(diào)用const成員函數(shù)。
成員函數(shù)可以返回本類對象及引用,指針。返回對象時可以設(shè)定const屬性。
定義類的時候不能具有自身類型的數(shù)據(jù)成員,但可以是指向自身類型的指針或引用。
一旦遇到右花括號,類的定義就結(jié)束了。
未知時間(同上)
const構(gòu)造函數(shù)是不必要的。
構(gòu)造函數(shù)的工作是初始化對象。
構(gòu)造函數(shù)初始化式只在構(gòu)造函數(shù)的定義中而不是聲明中指定。
從概念上講,可以認為構(gòu)造函數(shù)分兩個階段執(zhí)行:(1)初始化階段;(2)普通的計算階段。
在構(gòu)造函數(shù)初始化列表中沒有顯示提及的每個成員,使用與初始化變量相同的規(guī)則來進行初始化。運行該類型的默認構(gòu)造函數(shù),來初始化類類型的數(shù)據(jù)成員。內(nèi)置或復(fù)合類型的成員初始化值依賴于對象的作用域:在局部作用域中這些成員不被初始化,而在全局作用域中它們被初始化為0。
必須對任何const或引用類型的成員以及沒有默認構(gòu)造函數(shù)的類類型的任何成員使用初始化式。
構(gòu)造函數(shù)初始化列表僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員被初始化的次序就是定義成員的次序。
初始化的次序常常無關(guān)緊要。然而,如果一個成員是根據(jù)其他成員而初始化,則成員初始化的次序是至關(guān)重要的。
安裝與成員聲明一致的次序編寫構(gòu)造函數(shù)初始化列表是個好主意。此外,盡可能避免使用成員來初始化其他成員。
初始化式可以是任意表達式。
只要定義一個對象時沒有提供初始化式,就使用默認構(gòu)造函數(shù)。為所有形參提供默認實參的構(gòu)造函數(shù)也定義了默認構(gòu)造函數(shù)。
實際上,如果定義了其他構(gòu)造函數(shù),則提供一個默認構(gòu)造函數(shù)幾乎總是對的。
可以用單個實參來調(diào)用的構(gòu)造函數(shù)定義了從形參類型到該類型的一個隱式轉(zhuǎn)換。
當(dāng)構(gòu)造函數(shù)被聲明為explicit時,編譯器將不使用它作為轉(zhuǎn)換操作符。
任何構(gòu)造函數(shù)都可以用來顯示地創(chuàng)建臨時對象。
通常,除非有明顯的理由想要定義隱式轉(zhuǎn)換,否則,但形參構(gòu)造函數(shù)應(yīng)該為explicit。將構(gòu)造函數(shù)設(shè)置為explicit可以避免錯誤,并且當(dāng)轉(zhuǎn)換有用時,用戶可以顯示地構(gòu)造對象。
每個static數(shù)據(jù)成員是與類關(guān)聯(lián)的對象,并不與該類的對象相關(guān)聯(lián)。
Static成員函數(shù)沒有this形參,它可以直接訪問所屬類的static數(shù)據(jù)成員,但不能直接使用非static成員。
因為static成員不是任何對象的組成部分,所以static成員函數(shù)不能被聲明為const。畢竟,將成員函數(shù)聲明為const就是承諾不會修改該函數(shù)所屬的對象。
Static數(shù)據(jù)成員的類型可以是該成員所屬的類類型。Static數(shù)據(jù)成員可用作默認實參。
友元聲明將已命名的類或非成員函數(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