多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > C++primer(第四版)復習筆記―第三篇: 類和數據抽象

C++primer(第四版)復習筆記―第三篇: 類和數據抽象

來源:程序員人生   發布時間:2015-04-22 08:15:43 閱讀次數:3450次

數據抽象:是指定義數據和函數成員的能力;
封裝:是指從常規訪問中保護類成員的能力。
接口:成員函數定義了類的接口。通過將定義類所用到的數據和成員函數設置維為private來封裝類。

第102章: 類

1、 構造函數的初始化式只在構造函數的定義中而不是聲明中指出。
2、 使用構造函數的初始化列表與在構造函數體中對類的成員變量進行賦值的區分:本質就在于前者是對變量進行初始化,而后者是對變量進行賦值。
理解:構造函數的履行分為兩個階段:先初始化階段,再是普通計算階段。
在初始化階段構造函數將調用類類型的構造函數(沒有初始化列表時調用默許構造函數)對類類型的成員變量進行初始化,在普通計算階段才履行構造函數體的語句,因此在這時候是對成員變量進行賦值,覆蓋初始化階段的初始值。 對內置類型,根據對象定義的位置不同,初始化階段會不同(對全局對象,會將內置類型初始化為0,而局部變量則不初始化); 另外,對那些const對象成員、援用成員、沒有默許構造函數的類類型(否則會調用其默許構造函數,但其沒有)等,則必須提供初始化列表進行顯示初始化。
3、 建議構造函數使用初始化列表:1是效力:免去了普通計算階段的復制進程;2是:對那些const對象成員、援用成員、沒有默許構造函數的類類型(否則會調用其默許構造函數,但其沒有)等,則必須提供初始化列表進行顯示初始化。
4、 注意:成員初始化的次序與成員定義的次序相同(而不是按在初始化列表中出現的次序進行),所以應盡可能按定義的次序來給出初始化列表,并注意用1個成員來初始化其他成員時的前后問題。
5、 1個類只有無定義任何構造函數時才會自動生成合成的默許構造函數。對類類型調用其默許構造函數進行初始化;而對內置類型,當對象定義在全局時才進行初始化,在局部對象中不進行初始化。
6、 如果類包括內置或復合類型(指針 援用)等成員,則不應依賴于合成的默許構造函數,應當定義自己的構造函數來初始化這些變量。
7、 類通常應當定義1個默許構造函數,并且在默許構造函數中給成員提供的初始應當指出對象時“空”的。
8、 為所有形參提供默許實參的構造函數也定義了默許構造函數。
9、 默許構造函數的使用誤區:使用類A的默許構造函數定義對象:
A a();//這是毛病的,由于這會被編譯器解釋為定義了1個參數為空,返回1個對象A的函數。因此用默許構造函數時不能在后面帶括號(帶有參數的非默許構造函數則可以帶括號,在括號里給出實參值)。但這類用法是對的:A a=A();//右側調用默許構造函數創建對象,并用該對象初始化對象a.
10 、隱式類類型轉換:用單個實參來調用的構造函數定義了從參數類型到類類型的以個隱式轉換。如此,可在需要1個類類型的地方傳遞1個該參數類型,從而編譯器會調用該構造函數并以該參數為實參構造1個所需的類類型的臨時對象。 但注意:這類隱式轉換是不是為我們所需要的!否則應當避免。
11、 抑制由構造函數定義的隱式轉換: 將構造函數聲明為explict來避免構造函數被用作隱式類型轉換之用: 在構造函數聲明前加上關鍵字explicit(在類外的構造函數定義體上不能再加explicit)。 此時編譯器不不再使用構造函數作為類型轉換(編譯器會報錯)。
12、 為轉換而顯示的使用構造函數: 任何構造函數(包括默許)都可以顯示的創建臨時對象,即類名后面直接帶括號,括號里面給出要調用的構造函數的參數,而不給出對象名。(如:A();//創建1個無名的臨時對象)。
13、 通常,除非用明確的理由需要隱式轉換,否則單參數的構造函數前都應當加上explict以免毛病。 當需要類型轉換時可用顯示使用構造函數來顯示的創建臨時對象。
13、 類成員的顯示初始化:當沒有定義構造函數,且所有數據成員都為共有時,可按初始化數組元素的方式來初始化所有數據成員
如: struct A { int i; int* p};
A a={0,0};//a.i=0; a.p=o
; (根據數據成員的聲明次序進行初始化)
14、 友元機制允許1個類將其非共有成員的訪問權授與指定的函數或類。 Friend只能出現在類內部。 友元聲明可以在類中的任意位置:友元不是該類的成員,u因此它們不受其聲明出現部份的訪問控制影響。
15、 Static類成員:是類的組成部份,而不是某個對象的組成部份(為類的全部對象共有,因此可用于在類的全部對象間傳遞信息,如記錄創建了多少個該類的對象)。Static的成員,只用在類中聲明時指定static,在內外定義時不用重復指定為static。
16、 static數據成員:存在于類類型的每一個對象中,且獨立于該類的某個特定對象而存在,與該類關聯,而非該類的某個對象。 Static數據成員必須在類外部定義(正好1次),由于其不是通過類的構造函數來初始化的,而是在定義時進行初始化。 常在類的非內聯函數的定義文件中定義static數據成員(不用再重復指定為static),定義時與定義1般成員函數1樣,需要在類型后,變量明前指定完全限定名,以指定屬于哪一個類,如:
int A::static_member=10;(注,只要出現全完限定名,其后面的內容就是在類作用域中。) 特殊的:對cosnt static int 數據成員,只要其初始化式是1個常量表達式,就能夠直接在類中進行初始化,(但其他類型的cosnt static數據成員,還是需要在類外部進行定義初始化):

class A{ private: static const int a =30; //直接在類定義體中進行用常量表達式初始化 static const string str;//不能在類中進行初始化。 };

Static函數成員:沒有this參數,可以直接訪問所屬類的靜態成員,但不能直接使用非靜態成員。
17、 static成員遵守正常的訪問權限。 Static成員函數不能聲明為const函數(由于const成員函數是為不修改其對象),其不能被聲明為虛函數。Static數據成員可定義為任意數據類型。
18、 static成員可以像其他普通成員那樣被對象援用,也能夠直接使用作用域操作符直接以類調用:A::static_member.。 (static成員非對象所有,因此可以獨立于對象而被使用)。 如:Static數據成員的類型可以是其類類型。

第103章: 復制控制

1、 構造函數 和 復制控制成員(復制構造函數、賦值操作符函數、析構函數)不能被繼承,但在派生類中能調用基類的這些函數,且不能定義為虛函數(除析構函數外),(賦值操作符函數:由于不能不被繼承,所以派生類1定有自己的版本,因此定義為虛函數無意義;構造函數:在對象構造之前運行,此時對象的動態類型還不完全,因此定義為虛函數無意義)。每一個類定義自己的構造函數和復制控制成員,如果不定義就使用合成版本。 派生類中如果自己定義了構造函數或復制控制成員,若沒有顯示調用直接基類的構造函數或復制控制成員,則會使用基類的默許版本來構造或復制基類部份(派生類的構造函數可在初始化列表中顯示指出,而賦值操作符可在函數體中顯示調用基類版base::operator=(rhs)本來完成基類部份)。 注意:賦值操作符中需要檢查是不是為自我賦值:

Drivied& Drivied::operator=(Derivied& rhs) { if(*this!=rhs){ base::operator=(rhs); //賦值基類部份 //繼續復制派生類自己定義的成員 } Return *this; }

2、 只包括類類型、內置類型類可以不用定義自己的構造函數和復制控制成員和析構函數;如果有指針成員則不能再依賴于合成版本。
3、 動態綁定只會產生在基類的援用或指針(可綁定到基類或派生類對象)在調用虛函數時。 可用派生類來給基類賦值或構造基類(基類的賦值構造函數),由于復制構造函數和賦值操作符的形參為基類的const援用,因此可綁定到派生類(該進程派生類對象產生假切割,即拋棄了派生自定義成員部份)。注意:雖然基類指針或援用可綁定到派生類對象(實際是其中的基類部份),還是只能訪問派生類對象中的基類部份
4、 派生類析構函數不負責撤消基類對象的成員。編譯器總是顯示調用派生類對象基類部份的析構函數。每一個析構函數只負責清除自己的成員。對象的撤消順序與構造相反:先運行派生類的析構函數,然后順次向上調用各基類的析構函數。
5、 虛析構函數:析構函數可定義為虛函數,且虛性質可被繼承(但析構函數本身不能被繼承)。當動態析構1個基類指針時,根據指針的動態類型來自動選擇調用基類的析構函數還是派生類析構函數(由于析構函數聲明為虛函數)。 因此就算基類的析構函數甚么也不需要做,也需要定義1個虛析構函數。
6、 在構造與析構派生類對象期間,派生類對象的類型是變化的:在構造時,首先構造其基類部份,此時為基類類型;在析構時先析構其派生類部份,在調用基類析構函數時只剩下基類部份,因此為基類類型。
7、 重載、覆蓋與隱藏
1).重載:成員函數具有以下的特點時產生”重載”
A.相同的范圍(同1個類中)
B.函數的名字相同
C.參數類型不同(不能進行隱式類型轉換)
D.Virtual關鍵字可有可無
2).覆蓋(也叫”繼承”):指派生類函數覆蓋基類函數,特點是:
A.不同的范圍(分別位于基類與派生類中)
B.函數名字相同
C.參數相同
D.基類函數必須有virtual關鍵字
3).隱藏:是指派生類的函數屏蔽了與其同名(參數列表,返回類型無關)的基類函數,規則以下:
A.如果派生類的函數與基類的函數同名,但是參數不同,此時不論有沒有virtual關鍵字,基類的函數都將被隱藏,注意別與重載混淆)
B.如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual關鍵字,此時基類的函數被隱藏
被隱藏的基類成員,派生類對象可通過基類名加作用域符來顯示說明該處要調用基類的該成員。 在派生類中被隱藏的基類版本成員是存在的,只是被隱藏,不能通過派生類對象調用。
所以,隱藏(不同作用域)規則的底層緣由實際上是C++的名字解析進程(即先在派生類域中查找該名字的成員,1旦找到就停止,如果沒有才會繼續到基類域中查找。 重載必須在
同1作用域中,查找時是查找最優匹配)
覆蓋規則釀成的調用現象,其實就是類的虛函數實現原理生成的
8、 含有或繼承有1個或多個純虛函數的類是抽象基類。 抽象基類除可作為其派生類對象的抽象基類組成部份外,不能創建抽象基類的對象。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美成人亚洲高清在线观看 | 亚洲有码区 | jizz大全jizz大全jizz| 亚洲综合精品一二三区在线 | 亚洲免费色视频 | 日韩 欧美 亚洲 中文字幕 | 免费成年人在线视频 | 手机看片日韩国产一区二区 | 91精品欧美一区二区综合在线 | 亚洲麻豆精品 | 亚洲网站视频在线观看 | 国产高清一区二区三区免费视频 | 亚洲国产第一区二区三区 | 国产一国产一级毛片视频 | 欧洲免费无线码一二区 | 国产精品福利片 | 成人啪精品视频免费网站 | 久久国产精品免费视频 | 日韩欧美一区二区在线观看 | 免费看亚洲 | 黑人videovideosex大 | 欧美激情伊人 | 一区二区三区四区 | 欧美jizzhd精品欧美另类 | 性欧美free | 波多野吉衣在线多野结衣 | 欧美韩一级片 | 欧美18videossex性欧美 | 在线亚洲欧洲国产综合444 | 精品国产第一国产综合精品 | 手机看片日韩国产一区二区 | 免费一级欧美大片久久网 | 免费网站www网站免费 | 国产成人女人视频在线观看 | 成人欧美一区二区三区黑人 | 欧美18videosex性欧 | 91热久久免费频精品黑人99 | www啪| 亚洲欧美一区二区三区图片 | 成人免费淫片免费观看 | 久久久久久亚洲精品影院 |