C++-程序設(shè)計題解與上機(jī)指導(dǎo).ppt_第1頁
C++-程序設(shè)計題解與上機(jī)指導(dǎo).ppt_第2頁
C++-程序設(shè)計題解與上機(jī)指導(dǎo).ppt_第3頁
C++-程序設(shè)計題解與上機(jī)指導(dǎo).ppt_第4頁
C++-程序設(shè)計題解與上機(jī)指導(dǎo).ppt_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第4章類和對象 重點 在理解類和對象概念的基礎(chǔ)上學(xué)習(xí)類的聲明和定義 引入C 的類 class 和對象 object 的概念 建立 函數(shù)也可以是數(shù)據(jù)類型的成員 的思想 類的聲明和定義構(gòu)造函數(shù) 析構(gòu)函數(shù)對象的創(chuàng)建和使用對象的數(shù)組 指針 賦值和復(fù)制靜態(tài)成員共用數(shù)據(jù)的保護(hù)友元 4 0面向?qū)ο蟪绦蛟O(shè)計方法概述 數(shù)據(jù)函數(shù) 方法 操作 調(diào)用對象中的函數(shù)就是向該對象發(fā)消息 是對象的少量的對外接口 封裝性 信息隱蔽 C 中 現(xiàn)實的問題空間 抽象 現(xiàn)實中對象類對象 類的一個實例 抽象出 C 類型變量 繼承性與軟件重用 利用一個已有的類建立一個新類 多態(tài)性 由繼承而產(chǎn)生的相關(guān)的不同的類 其對象對同一消息會做出不同響應(yīng) 數(shù)據(jù)函數(shù) 算法 對象1 數(shù)據(jù)函數(shù) 算法 對象2 系統(tǒng) 程序 消息 面向過程 面向?qū)ο?不同層次的抽象 基于對象就是基于類 C 中的類是實現(xiàn)面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ) 面向?qū)ο筌浖_發(fā)規(guī)范的軟件開發(fā)過程 軟件工程學(xué)要解決的問題 1 面向?qū)ο蠓治鯫OA 粗略的分析任務(wù) 歸納出有關(guān)對象2 面向?qū)ο笤O(shè)計OOD 對類進(jìn)行具體的設(shè)計 提出程序設(shè)計的思路和方法 包括算法 3 面向?qū)ο缶幊蘋OP 選定一種語言寫程序 4 面向?qū)ο鬁y試OOT 以類作為測試的基本單元5 面向?qū)ο缶S護(hù)OOSM OOP的特性 抽象封裝和數(shù)據(jù)隱藏繼承多態(tài)代碼的可重用性 現(xiàn)實中對象類型 抽象 對象類類型 定義 4 1類的聲明和實現(xiàn) 類和對象的關(guān)系類是對象的抽象 對象是類的具體實例 某對象的類型稱為某類 或某對象是某類類型的一個變量 類類型是一種自定義的數(shù)據(jù)類型 用戶要先提供類的聲明和實現(xiàn) 然后才能使用 類型是什么 指定類型完成了3項工作 1 決定數(shù)據(jù)對象需要的內(nèi)存數(shù)量2 決定如何解釋內(nèi)存中的位3 決定可使用數(shù)據(jù)對象執(zhí)行的操作或方法對內(nèi)置的基本類型來說 有關(guān)操作的信息被內(nèi)置到編譯器中 用戶自定義的類型必須自己提供這些信息 具有根據(jù)實際需要定制新數(shù)據(jù)類型的強(qiáng)大功能和靈活性 類是將抽象轉(zhuǎn)換為用戶定義類型的C 工具 它將數(shù)據(jù)和操縱數(shù)據(jù)的方法組合成一個整體 類規(guī)范由兩部分組成 類聲明 類的藍(lán)圖 類方法定義 描述如何實現(xiàn)類成員函數(shù) Class類名 private 私有成員聲明塊 protected 保護(hù)成員聲明塊 public 公有成員聲明塊 一 類的聲明 指出該類包括哪些數(shù)據(jù)和操作 類頭 類體 數(shù)據(jù)成員成員函數(shù)成員訪問屬性修飾符 分號結(jié)束 classCStudent public intnum charname 20 charsex voiddisplay 例 二 類成員訪問屬性 控制外部對類成員的訪問 體現(xiàn)了類的數(shù)據(jù)隱藏性 1 private 限定為私有成員 該成員只能被本類中的成員函數(shù)和類的友元函數(shù)引用 是類中的默認(rèn)訪問控制 可實現(xiàn)信息隱蔽 2 public 公用的成員可被本類中的成員函數(shù)引用 也可被類的作用域的其他函數(shù)引用 是類的對外接口3 protected 受保護(hù)成員不能被類外訪問 但可以被派生類的成員函數(shù)訪問 說明 每種說明符可在類體中使用多次 訪問限定符的作用域是從該說明符出現(xiàn)開始到下一個說明符之前或類體結(jié)束之前結(jié)束 如果在類體起始點無訪問說明符 系統(tǒng)默認(rèn)定義為私有 private 訪問限定符private 私有的 和protected 保護(hù)的 體現(xiàn)了類具有數(shù)據(jù)隱蔽性 Encapsulation classCStudent intnum public floatdata private stringname charsex public voiddisplay 類和結(jié)構(gòu)體的異同C 中擴(kuò)展了C中結(jié)構(gòu)體struct的定義 使類和結(jié)構(gòu)體具有同樣的功能 但結(jié)構(gòu)體中默認(rèn)的成員訪問限定為public 即它不天生具備信息隱蔽的特征 structCStudent 建議盡量使用類class 三 類的實現(xiàn) 類的成員函數(shù)的定義 函數(shù)定義 通常在類定義中 成員函數(shù)僅作聲明 函數(shù)定義通常在類的聲明之后 在類外進(jìn)行 格式如下 返回值類型類名 函數(shù)名 參數(shù)表 函數(shù)體 其中運算符 稱為作用域運算符 它指出該函數(shù)是屬于哪一個類的成員函數(shù) classCStudent intnum stringname charsex intgetnum returnnum public voiddisplay voidCStudent display cout num getnum endl cout name name endl cout sex sex endl display 類的成員具有類作用域 它們不是全局函數(shù) 四 inline成員函數(shù)在類內(nèi)定義的函數(shù)默認(rèn)為內(nèi)聯(lián)函數(shù)在類內(nèi)用inline聲明的函數(shù) 在類外定義 前面加inline 例 classCStudent intnum public voiddisplay1 cout hello endl inlinevoiddisplay2 inlinevoidCStudent display2 cout num num endl 內(nèi)聯(lián)成員函數(shù)只能在定義它們的文件中調(diào)用 類聲明和成員函數(shù)定義的分離 即接口和實現(xiàn)的分離 用戶的mymain cpp include 類聲明頭文件 h 類聲明頭文件 h 類成員函數(shù)定義文件 cpp include 類聲明頭文件 h mymain obj obj mymain exe 連接link 類聲明和成員函數(shù)定義的分離 即接口和實現(xiàn)的分離 用戶的mymain cpp include 類聲明頭文件 h 類聲明頭文件 h mymain obj 預(yù)先編譯好的庫文件 obj mymain exe 連接link 定義一種數(shù)據(jù)類型只是告訴編譯系統(tǒng)該數(shù)據(jù)類型的構(gòu)造 并沒有預(yù)定內(nèi)存 類只是一個樣板 以此樣板可以在內(nèi)存中開辟出同樣結(jié)構(gòu)的實例 對象 五 定義對象的方法 一 對象的創(chuàng)建對象的靜態(tài)創(chuàng)建1 先聲明類類型 然后再定義對象CStudentstud1 stud2 classCStudentstud1 2 在聲明類類型的同時定義對象classCStudent stud1 stud2 動態(tài)創(chuàng)建類名 指針 new類名 參數(shù) 釋放delete指針 二 對象的訪問 對象成員的訪問方法 1 對象名 成員 為成員運算符 stu1 display 2 通過指向?qū)ο蟮闹羔樤L問對象成員CStuent p stu1 p 直接訪問間接訪問簡單訪問 三 對象的存儲 圖1各對象完全獨立地安排內(nèi)存的方案 注意 區(qū)別同一個類的各個不同的對象的屬性是由數(shù)據(jù)成員決定的 不同對象的數(shù)據(jù)成員的內(nèi)容是不一樣的 而行為 操作 是用函數(shù)來描述的 這些操作的代碼對所有對象都是一樣的 圖2各對象的代碼區(qū)共用的方案 數(shù)據(jù)區(qū) 對象1 數(shù)據(jù)區(qū) 對象 數(shù)據(jù)區(qū) 對象 公共代碼區(qū) 圖2僅為每個對象分配一個數(shù)據(jù)區(qū) 而代碼區(qū) 放所有成員函數(shù)的區(qū)域 為各對象共用 如何確定函數(shù)訪問的是哪一個對象的數(shù)據(jù)成員this指針 物理實現(xiàn)和邏輯上關(guān)系 4 3節(jié)詳講 例 include iostream usingnamespacestdclassCStudent floatscore public intnum charsex public voidfun1 inta voiddisplay voidCStudent display cout sex num endl cout score score endl voidCStudent fun1 floata score a CStudentstud1 intmain stud1 num 9011 stud1 sex F intb cin b stud1 score 98 0 stud1 fun1 b stud1 display cout sizeof CStudent cout sizeof stu1 return0 類的簡單應(yīng)用 實際使用中通常利用構(gòu)造函數(shù)來初始化數(shù)據(jù)成員 對象的數(shù)據(jù)成員如何初始化 類中的私有數(shù)據(jù)成員如何賦值 例 include iostream usingnamespacestdclassCStudent floatscore public intnum private voidfun1 inta public voiddisplay intc voidCStudent display intc fun1 c cout num num endl cout score score endl voidCStudent fun1 inta score a intmain CStudent p1 p1 newCStudent p1 num 9011 intb cin b p1 display b deletep1 return0 私有成員函數(shù)的使用 4 2類的默認(rèn)成員函數(shù)及其定義 默認(rèn)構(gòu)造函數(shù)默認(rèn)拷貝構(gòu)造函數(shù)默認(rèn)析構(gòu)函數(shù)默認(rèn)賦值運算符函數(shù)默認(rèn)取地址運算符函數(shù)是編譯器自動添加的 當(dāng)功能不滿足要求時用戶可以按要求重新自定義這些函數(shù) 構(gòu)造函數(shù)和析構(gòu)函數(shù) C 的目標(biāo)是使得使用類與使用基本的內(nèi)置類型盡可能相同 即要創(chuàng)建對象 可以定義類變量 也可以使用new為類對象分配存儲空間 可以將對象作為函數(shù)的參數(shù)和返回值 也可以將一個對象賦給另一個 初始化對象 創(chuàng)建對象時對它的數(shù)據(jù)成員進(jìn)行初始化 一種可能的初始化方法 對類的公有數(shù)據(jù)成員 可象結(jié)構(gòu)體變量一樣初始化 但這違背了類信息隱藏的初衷 Cstudentstu1 97101 wangdali 男 但往往存在私有數(shù)據(jù)成員 程序不能直接訪問它們 而只能通過成員函數(shù)來訪問這些數(shù)據(jù)成員 因此要設(shè)計合適的成員函數(shù) 才能成功的將對象初始化 為此 C 提供了特殊的成員函數(shù) 構(gòu)造函數(shù) 一 構(gòu)造函數(shù) 功能 構(gòu)造函數(shù)是一種特殊的成員函數(shù) 它主要用于對對象成員進(jìn)行初始化 給具體數(shù)值 或給指針成員分配空間等 聲明和定義構(gòu)造函數(shù) 具有一些特殊的性質(zhì) 構(gòu)造函數(shù)的名字必須與類名相同 構(gòu)造函數(shù)可以有任意類型的參數(shù) 但不能具有返回值 構(gòu)造函數(shù)的使用在創(chuàng)建對象時 系統(tǒng)會自動地調(diào)用構(gòu)造函數(shù) 從而保證了先初始化后訪問的順序 例如 classcdemo cdemo 例如 classcdemo cdemo cdemo cdemo 例1classcomplex private doublereal imag public complex doubler doublei real r imag i doubleabscomplex doublet t real real imag imag returnsqrt t voidmain complexA 1 1 2 2 定義類的對象A時調(diào)用構(gòu)造函數(shù)complexcomplexb 5 6 8 9 cout absofcomplexA A abscomplex endl 形參不要與數(shù)據(jù)成員同名 例2沒有參數(shù)的構(gòu)造函數(shù)classcomplex private doublereal imag public complex real 6 imag 8 doubleabscomplex doublet t real real imag imag returnsqrt t voidmain complexA 定義類的對象A時調(diào)用構(gòu)造函數(shù)complexcout absofcomplexA A abscomplex endl 例3用初始化列表對簡單的數(shù)據(jù)成員進(jìn)行初始化classcomplex private doublereal imag public complex doubler doublei real r imag i doubleabscomplex voidmain complexA 6 0 8 0 定義類的對象A時調(diào)用構(gòu)造函數(shù)complexcout absofcomplexA A abscomplex endl 說明 1 構(gòu)造函數(shù)的名字必須與類名相同 否則將被當(dāng)作一般的成員函數(shù)來處理 一般聲明為public 2 構(gòu)造函數(shù)也可采用初始化列表對簡單的數(shù)據(jù)成員進(jìn)行初始化 但數(shù)組和指針等成員的初始化應(yīng)在構(gòu)造函數(shù)體中書寫 初始化列表只能用于類的構(gòu)造函數(shù) 3 構(gòu)造函數(shù)不能像其它成員函數(shù)那樣被顯式地調(diào)用 它是在創(chuàng)建對象的同時系統(tǒng)自動調(diào)用一次 4 C 提供兩種調(diào)用形式 隱式調(diào)用構(gòu)造函數(shù) complexA 1 1 2 2 顯式的調(diào)用構(gòu)造函數(shù) complexA comples 1 1 2 2 無參構(gòu)造函數(shù)調(diào)用形式 complexA 5 在實際應(yīng)用中 通常需要給每個類定義構(gòu)造函數(shù) 如果沒有給類定義構(gòu)造函數(shù) 則編譯系統(tǒng)自動地添加一個默認(rèn)的構(gòu)造函數(shù) 形如 complex complex 是一個無參空函數(shù) 一旦自定義了構(gòu)造函數(shù) 系統(tǒng)就不再生成默認(rèn)的構(gòu)造函數(shù)了 classcomplex private doublereal imag public voidset doubler doublei real r imag i doubleabscomplex doublet t real real imag imag returnsqrt t voidmain complexA 定義類的對象A時調(diào)用默認(rèn)構(gòu)造函數(shù)complexA set 1 1 2 2 cout absofcomplexA A abscomplex endl 二 構(gòu)造函數(shù)的重載 一個類中可以定義多個構(gòu)造函數(shù) 以便對類對象提供不同的初始化方法 構(gòu)造函數(shù)的名字相同 參數(shù)的個數(shù)或類型不同 classcomplex private doublereal imag public complex real 6 imag 8 complex doubler doublei real r imag I intmain complexa b 1 1 2 2 定義一個對象時 只能執(zhí)行其中一個構(gòu)造函數(shù) 例 定義了構(gòu)造函數(shù) 但無默認(rèn)構(gòu)造函數(shù)時 classcomplex private doublereal imag public complex doublea real a imag a complex doubler doublei real r imag I intmain complexa 4 0 b 1 1 2 2 complexc 為類定義了非默認(rèn)構(gòu)造函數(shù)后 程序員一般必須為它提供默認(rèn)構(gòu)造函數(shù) 這樣可禁止創(chuàng)建未初始化的對象 三 使用默認(rèn)參數(shù)的構(gòu)造函數(shù) 對于帶參數(shù)的構(gòu)造函數(shù) 在定義對象時必須給構(gòu)造函數(shù)傳遞參數(shù) 否則構(gòu)造函數(shù)將不被執(zhí)行 但在實際使用中 有些構(gòu)造函數(shù)的參數(shù)值通常是不變的 只有在特殊情況下才需要改變它的參數(shù)值 這時可以將其定義成帶默認(rèn)參數(shù)的構(gòu)造函數(shù) 在聲明構(gòu)造函數(shù)時指定默認(rèn)參數(shù)Complex doubler 1 doublei 1 相當(dāng)于多個重載的構(gòu)造函數(shù) 重載和默認(rèn)參數(shù)的構(gòu)造函數(shù)不應(yīng)同時使用 因容易出現(xiàn)二義性 classcomplex private doublereal imag public complex doubler 1 doublei 1 complex complex doubler doublei real r imag I intmain complexa b 2 c 3 4 四 析構(gòu)函數(shù) 析構(gòu)函數(shù)也是一種特殊的成員函數(shù) 它執(zhí)行與構(gòu)造函數(shù)相反的操作 通常用于執(zhí)行一些清理任務(wù) 如釋放分配給對象的內(nèi)存空間等 析構(gòu)函數(shù)有以下一些特點 析構(gòu)函數(shù)與構(gòu)造函數(shù)名字相同 但它前面必須加一個波浪號 析構(gòu)函數(shù)沒有參數(shù) 也沒有返回值 而且不能重載 因此在一個類中只能有一個析構(gòu)函數(shù) 當(dāng)撤消對象時 對象生命周期結(jié)束時 系統(tǒng)會自動地調(diào)用析構(gòu)函數(shù) 例 classcomplex doublereal imag public complex doubler 0 0 doublei 0 0 cout construction endl real r imag i complex cout destruction endl doubleabscomplex returnsqrt real real imag imag intmain complexA 1 1 2 2 cout absofcomplexA A abscomplex endl return0 construction absofcomplexA 2 45967 destruction 結(jié)果 析構(gòu)函數(shù)的作用并不是刪除對象 而是在撤銷對象占用的內(nèi)存之前完成一些清理工作 釋放資源 或用戶希望在最后一次使用對象之后所執(zhí)行的任何操作 每個類必須有一個析構(gòu)函數(shù) 若沒有顯式地為一個類定義析構(gòu)函數(shù) 編譯系統(tǒng)會自動地添加一個缺省的析構(gòu)函數(shù) 如 complex 對于大多數(shù)類而言 缺省的析構(gòu)函數(shù)已經(jīng)足夠了 但是 如果在一個對象完成其操作之前需要做一些內(nèi)部處理 則應(yīng)該顯式地定義析構(gòu)函數(shù) 例如 classdata private int p public data inta p newint p a data deletep intmain datax 6 return0 例1 釋放內(nèi)存 classstring data private char str publie string data char s str newchar strlen s 1 strcpy str s string data deletestr intmain string datax abc return0 例2 釋放內(nèi)存 同一類存儲類別的對象的構(gòu)造和析構(gòu)的執(zhí)行順序 classXYZ intmain XYZA B 構(gòu)造 析構(gòu) 調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序 先構(gòu)造的后析構(gòu) 后構(gòu)造的先析構(gòu) 對象的存儲類別不同 生命周期不同全局對象 在主函數(shù)之前構(gòu)造 主函數(shù)結(jié)束或調(diào)用exit 0 時 析構(gòu) 局部自動對象 函數(shù)調(diào)用 建立對象時構(gòu)造 函數(shù)結(jié)束時析構(gòu) 多次調(diào)用函數(shù) 就多次構(gòu)造和析構(gòu) 局部靜態(tài)對象 程序第一次調(diào)用函數(shù)時構(gòu)造 主函數(shù)結(jié)束或調(diào)用exit 0 時 析構(gòu) 其間 調(diào)用函數(shù)不構(gòu)造也不析構(gòu) voidfun staticcstudentb cstudentc main cout begin endl fun cstudent p1 p1 newcstudent deletep1 fun 例 構(gòu)造和析構(gòu)順序 include iostream usingnamespacestd classcstudent intnum public cstudent cstudent stu1 cstudent cstudent cout 構(gòu)造函數(shù) endl 在第一調(diào)用fun 時創(chuàng)建靜態(tài)對象b 到整個程序結(jié)束時才撤銷b 五 拷貝構(gòu)造函數(shù)用已知對象創(chuàng)建新對象1 用已知對象初始化新對象 2 函數(shù)形參為對象3 函數(shù)的返回值為對象典型功能 將實參對象的非靜態(tài)成員逐個拷貝到新創(chuàng)建的對象中 定義方法編譯器自動添加的默認(rèn)拷貝構(gòu)造函數(shù)用戶也可根據(jù)自己的需要自定義拷貝構(gòu)造函數(shù)形式complex constcomplex 常引用 使參數(shù)值不能被改變 a是用來初始新對象的對象的引用 1 說明 何時調(diào)用 對象拷貝是初始化時進(jìn)行的 功能 是已有對象的克隆 是淺復(fù)制 通常缺省的復(fù)制構(gòu)造函數(shù)是能夠勝任工作的 但若類中有指針類型時 按成員復(fù)制的方法有時會產(chǎn)生錯誤 與常規(guī)的賦值表達(dá)式 不同 例 當(dāng)類中有指針類型時 缺省的拷貝構(gòu)造函數(shù)存在的問題 classstring data private char str inti publie string data char s str newchar strlen s 1 strcpy str s i p i string data deletestr intmain string datax abc string datay x return0 對象x和y的成員str指向同一個內(nèi)存空間 析構(gòu)時會出問題 例 classstring data private char str inti public string data char s str newchar strlen s 1 strcpy str s string data conststring data 當(dāng)類中有指針類型時 正確的處理方法是增加自己的拷貝構(gòu)造函數(shù) 2 調(diào)用拷貝構(gòu)造函數(shù)的幾種情況程序中需要新建一個對象時 當(dāng)函數(shù)的參數(shù)為類的對象時 按實參拷貝創(chuàng)建一個形參 函數(shù)的返回值是類的對象 拷貝創(chuàng)建一個無名臨時對象 例 voidfun BOXb intmain BOXbox1 12 15 18 fun box1 return0 例 BOXf BOXbox1 12 15 16 returnbox1 intmain BOXbox2 f return0 六 賦值運算符函數(shù) 運算符的重載 將一個已知對象賦給另一個已創(chuàng)建好的對象 同類對象間賦值 基本賦值運算 不同類對象間賦值 廣義賦值運算定義方法編譯器自動添加的默認(rèn)賦值函數(shù) 讓兩對象的數(shù)據(jù)成員相等 自定義賦值函數(shù)形式 student 第五章再詳講 4 3對象的創(chuàng)建和使用 1 對象的創(chuàng)建與存儲靜態(tài)創(chuàng)建動態(tài)創(chuàng)建2 對象的存儲獨立的數(shù)據(jù)成員 共享的成員函數(shù)this指針3 對象的訪問方法與規(guī)則4 對象的使用 普通對象 引用 指針 對象數(shù)組 對象成員函數(shù)參數(shù) 函數(shù)的返回值 對象可為外界提供服務(wù) 向?qū)ο蟀l(fā)消息 this指針 C 提供了一個特殊的對象指針 this指針 它指向類對象的首地址 成員函數(shù)通過這個指針可以知道自己當(dāng)前屬于哪一個對象 this指針是一種隱含指針 它隱含于每個類的成員函數(shù)中 this指針 幕后 工作機(jī)理 classABC private chara intb public voidinit charma intmb a ma b mb voidmain ABCob oc ob init x 12 oc init t 56 C 在編譯過程中做了些簡單的轉(zhuǎn)換工作 1 把成員函數(shù)的調(diào)用形式進(jìn)行變化 init 2 相應(yīng)地把被調(diào)用的成員函數(shù)的定義形式進(jìn)行變化 init ABC this charma intmb this a ma this b mb 我們可以直接顯式的使用this指針例4 11構(gòu)造函數(shù)等特殊成員函數(shù)中也有this指針 成員函數(shù)內(nèi)部訪問其他成員函數(shù) this指針將被逐級傳遞下去 this指針是const指針 即編譯器規(guī)定不允許在程序中修改它的值 當(dāng)形式參數(shù)與數(shù)據(jù)成員同名時 需要加this classABC intx public voidset intx this x x 或 this x x voidout cout x intmain ABCp p set 5 p out return0 C 對變量的檢查順序 局部變量 類的數(shù)據(jù)成員 全局變量 4 3 2對象的訪問方法與規(guī)則 對象的訪問 指對對象成員的訪問 1 訪問方法 簡單訪問 直接訪問 間接訪問 2 訪問規(guī)則 根據(jù)訪問位置制訂不同訪問規(guī)則 內(nèi)部訪問及規(guī)則 在成員函數(shù)里面對本類對象的訪問當(dāng)前對象的訪問 可直接 間接 簡單本類其他對象的訪問 可直接 間接內(nèi)部訪問可方位對象的所有成員 外部訪問 在全局函數(shù)里訪問任何類的對象成員 或在某類的成員函數(shù)里訪問其它類的對象的成員 間接 直接只能訪問公有成員 例 classdemo inta fun1 public demo intc fun2 demob demo demo intc a c demo fun1 couta endl demo fun2 demob this a b a fun1 voidmain demod1 4 d2 6 pd d1 fun2 d2 pd 錯誤 4 3 3對象的使用 pointp1 p2 p2 p1 對象的賦值pointp3 p1 p4 p1 對象拷貝point 指針通過函數(shù)參數(shù)傳遞對象函數(shù)形參為普通對象函數(shù)形參為對象指針函數(shù)形參為對象的引用 見書上例4 15 4 16 4 17 函數(shù)返回對象函數(shù)返回普通對象函數(shù)返回對象指針 被取地址對象必須要有較長的生存期 函數(shù)返回對象的引用 被返回對象必須要有較長的生存期 見書上例4 18 4 19 4 20 4 3 4對象數(shù)組 指所有數(shù)組元素都是對象的數(shù)組 若一個類有若干個對象 我們把這一系列的對象用一個數(shù)組來存放 建立對象數(shù)組時 每一個元素都要調(diào)用構(gòu)造函數(shù)初始化 靜態(tài)創(chuàng)建數(shù)組 要提供合適的初始化實參 動態(tài)創(chuàng)建類對象數(shù)組 這個類必須有無參構(gòu)造函數(shù)或形參皆有缺省值數(shù)組元素的訪問方法 下標(biāo)法 地址法 指針法 指向?qū)ο蟮闹羔?注意初始化對象數(shù)組的方法 classcomplex private doublereal imag public complex doublea real a imag a complex doubler doublei real r imag i complex real imag 0 0 doubleabscomplex doublet t real real imag imag returnsqrt t 例 定義并初始化對象數(shù)組complexdemo1 5 complexdemo3 5 1 4 2 3 6 complexdemo2 5 complex 1 complex complex 1 1 2 2 cout demo1 0 abscomplex 標(biāo)準(zhǔn)格式 動態(tài)創(chuàng)建對象數(shù)組complex p newcomplex 3 p 0 complex 1 0 2 0 p 1 complex 3 0 delete p 必須有無參構(gòu)造函數(shù)或形參皆有缺省值 4 3 5對象成員 某個類的數(shù)據(jù)成員是其他類的對象 不能為本類對象 對象成員使用時的特殊規(guī)則 對象成員的聲明方式 不允許帶實參含對象成員的類的構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù) 賦值運算符函數(shù)的寫法不同以往 構(gòu)造和析構(gòu)函數(shù)的調(diào)用順序也有新規(guī)則 見書上4 3 5節(jié)的例子 如何解決該對象成員的初始化問題 1 含對象成員的類的構(gòu)造函數(shù) 格式 類名 類名 形參列表 對象成員名1 實參列表1 對象成員名n 實參列表n 構(gòu)造函數(shù)體 來自于形參列表 或為定值 如某對象成員不需傳遞實參 可以不出現(xiàn) 創(chuàng)建對象時 首先執(zhí)行對象成員的構(gòu)造函數(shù) 最后執(zhí)行其構(gòu)造函數(shù)的函數(shù)體 調(diào)用順序同聲明順序 與初始化列表中順序無關(guān) 與是否出現(xiàn)在初始化列表中也無關(guān) 由該類的構(gòu)造函數(shù)的參數(shù)傳遞出對象成員需要的初始化參數(shù) 體現(xiàn)了類和類之間的一種關(guān)系 該類的成員函數(shù)對這個對象成員的訪問屬于外部訪問 2 含對象成員的類的拷貝構(gòu)造函數(shù) 需在初始化列表中完成各個對象成員的拷貝student student conststudent 調(diào)用順序同構(gòu)造函數(shù)有時構(gòu)造函數(shù)只起到為對象成員傳遞實參的作用 3 含對象成員的類的析構(gòu)函數(shù) 析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)相反 4 含對象成員的類的賦值運算符函數(shù) 注意對象成員的賦值 4 4靜態(tài)成員 靜態(tài)成員 在類定義中 它的成員 包括數(shù)據(jù)成員和成員函數(shù) 可以用關(guān)鍵字static聲明為靜態(tài)的靜態(tài)成員的特性 不管這個類創(chuàng)建了多少個對象 靜態(tài)成員只有一個拷貝 這個拷貝被所有屬于這個類的對象共享 靜態(tài)成員包括 靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù) 一 靜態(tài)數(shù)據(jù)成員聲明為static的數(shù)據(jù)成員 存儲方式與一般的數(shù)據(jù)成員不同 無論建立了多少個對象 在內(nèi)存中都只有一個靜態(tài)數(shù)據(jù)的拷貝 靜態(tài)數(shù)據(jù)成員是單獨存儲的 而不是對象的組成部分 靜態(tài)數(shù)據(jù)成員的初始化不能在類中進(jìn)行初始化 也不能通過構(gòu)造函數(shù)初始化 因為在類中不給它分配內(nèi)存空間 必須在類聲明之外使用單獨的語句初始化 一般在main 開始之前 類的聲明之后的全局地帶為它初始化 缺省時 靜態(tài)成員被初始為0 格式 數(shù)據(jù)類型類名 靜態(tài)數(shù)據(jù)成員名 初值 生存期 靜態(tài)數(shù)據(jù)成員與靜態(tài)變量一樣 是在編譯時創(chuàng)建并初始化 它在該類的任何對象被建立之前就存在 它可以在程序內(nèi)部不依賴于任何對象被訪問 到程序結(jié)束時才釋放 訪問方法 外部訪問 靜態(tài)數(shù)據(jù)成員屬于類 而不像普通數(shù)據(jù)成員那樣屬于某一對象 因此可以使用 類名 訪問公有的靜態(tài)數(shù)據(jù)成員 也可通過對象名引用 對私有靜態(tài)數(shù)據(jù)成員只能通過類成元函數(shù)訪問 內(nèi)部訪問 具有類作用域 為什么要使用靜態(tài)數(shù)據(jù)成員 靜態(tài)數(shù)據(jù)成員的主要用途是定義類的各個對象所公用的數(shù)據(jù) 如統(tǒng)計總數(shù) 平均數(shù)等 而可以不必使用全局變量 依賴于全局變量的類幾乎都是違反面向?qū)ο蟪绦蛟O(shè)計的封裝原理的 classstudentintstudent total 0 char name intmain staticinttotal studentstu1 stu2 stu3 public studentstu1 stu2 stu3 name total name name 每個對象都有自己的name成員 只創(chuàng)建一個靜態(tài)成員 二 靜態(tài)成員函數(shù)前面有static聲明的成員函數(shù) 靜態(tài)成員函數(shù)可以定義成內(nèi)聯(lián)的 也可以在類外定義 在類外定義時 不要用static前綴 靜態(tài)成員函數(shù)是一種特殊的成員函數(shù) 它不屬于某一個特定的對象 而是屬于類的 在一般的成員函數(shù)中都隱含有一個this指針 用來指向?qū)ο笞陨?而在靜態(tài)成員函數(shù)中沒有this指針 因為它不與特定的對象相聯(lián)系 一般而言 靜態(tài)成員函數(shù)訪問的基本上是靜態(tài)數(shù)據(jù)成員 最好不用靜態(tài)成員函數(shù)引用非靜態(tài)數(shù)據(jù)成員 調(diào)用方法1 類名 靜態(tài)成員函數(shù)名 Student average 2 對象 靜態(tài)成員函數(shù)名 指向?qū)ο蟮闹羔?靜態(tài)成員函數(shù)名 stud1 average pstud1 average 使用靜態(tài)成員函數(shù)的另一個原因是 可以用它在建立任何對象之前處理靜態(tài)數(shù)據(jù)成員 這是普通成員函數(shù)不能實現(xiàn)的功能 比全局變量要安全 例 見書138頁例4 23 4 5數(shù)據(jù)的保護(hù) 有些數(shù)據(jù) 可以在不同場合通過不同途徑訪問 為了保證數(shù)據(jù)的安全 即不被任意修改 可以使用const來對其屬性進(jìn)行限定 有關(guān)類的數(shù)據(jù)保護(hù)的限定的幾種形式 常成員常對象對象的常引用指向?qū)ο蟮某V羔樦赶虺ο蟮闹羔樧兞?和對象有關(guān)的函數(shù)參數(shù)保護(hù)對象內(nèi)容不被修改 一 常成員1 常數(shù)據(jù)成員用const來聲明常數(shù)據(jù)成員 其值不能改變 不能被賦值 只能通過構(gòu)造函數(shù)的參數(shù)初始化表對常數(shù)據(jù)成員進(jìn)行初始化 例 classTime constinthour intsec public Time inth hour h sec 0 Time inth hour h sec 0 voidf cout hour hour 9 sec 30 intmain Timea1 8 a2 9 a1 f a2 f return0 2 常成員函數(shù)格式 返回類型成員函數(shù)名 形參 const聲明和定義函數(shù)時都要加const 調(diào)用時不需加 功能特點 只能讀本類中的數(shù)據(jù)成員而不能修改它們 除非是可變的數(shù)據(jù)成員 mutableintcount 可用常成員函數(shù)來修改它的值 常成員函數(shù)不能調(diào)用非常成員函數(shù) 防止間接修改 常成員是從類的角度 在類內(nèi)聲明成員的const屬性 二 常對象定義對象時指定對象為常對象 格式 類名const對象名 實參表列 const類名對象名 實參表列 不允許修改常對象中的數(shù)據(jù)成員的值 常對象的數(shù)據(jù)成員為常變量且必須要有初值 由構(gòu)造函數(shù)初始化 外界只能調(diào)用常對象的常成員函數(shù) 除了由系統(tǒng)自動調(diào)用的隱式的構(gòu)造函數(shù)和析構(gòu)函數(shù) 以防止修改對象中的數(shù)據(jù)成員的值 因常成員函數(shù)可以引用數(shù)據(jù)成員 但不會改變數(shù)據(jù)成員的值 可變的數(shù)據(jù)成員 mutableintcount 可用常成員函數(shù)來修改它的值 例 classd inti public inta d i 0 a 9 s i 6 f const d f const intq q i cout q intmain constdd1 d1 f cout d1 a d1 s d1 a 4 dd2 d2 f cout d2 a d2 s d2 a 4 return0 三 對象的常引用格式 const類名 引用名 對象 不能通過該引用改變對象 常用于函數(shù)形參 和指向常對象的指針變量一樣 使函數(shù)執(zhí)行過程中 不能通過形參改變實參的值 常引用 指向常對象的指針和常成員函數(shù)可保證調(diào)用對象不被修改 四 指向常對象的指針變量指向常對象的指針變量即可指向常對象 也可指向非常對象 不能通過該指針改變對象 只能用指向常對象的指針變量指向常對象 該指針變量本身可以改變 常用于函數(shù)形參 目的是保護(hù)形參指針?biāo)赶虻膶ο?使它在函數(shù)執(zhí)行過程中不被修改 即只想在函數(shù)中引用該對象 而不想改變它 例 Timet1 10 12 15 constTime p1 例 constTimet2 10 12 15 constTime p2 常對象和常成員對比常對象是在類外定義對象時 定義為常對象的 當(dāng)然也可定義該類的非常對象 無論類內(nèi)對成員如何聲明 該常對象的數(shù)據(jù)成員全轉(zhuǎn)變?yōu)槌W兞?函數(shù)成員的屬性不變 若想引用常對象的數(shù)據(jù)成員 在類聲明時必須聲明有常成員函數(shù) 具有常成員的類即可定義非常對象也可定義常對象 完全不具備常成員的類即可定義非常對象也可定義常對象 但此時常對象沒法使用 如何利用常對象和常成員當(dāng)類中只有部分?jǐn)?shù)據(jù)成員的值允許改變時 可將這部分?jǐn)?shù)據(jù)成員聲明為const 若所有數(shù)據(jù)成員的值都不許改變 可將所有數(shù)據(jù)成員聲明為const 或?qū)ο舐暶鳛槌ο?通過常成員函數(shù)來引用常對象中數(shù)據(jù)成員 四 指向?qū)ο蟮某V羔樃袷?類名 const指針變量名 對象地址 指針值始終保持為其初始化值 不能改變 即其指向始終不變 可將一個指針變量固定的和一個對象相聯(lián)系 往往用常指針作為函數(shù)的形參 目的是不允許函數(shù)執(zhí)行中改變指針變量的值 使其始終指向原來的對象 例 Timet1 10 12 15 t2 Time constptr1 對所指對象的使用沒有限制 五 指向常對象的指針變量1 指向常變量的指針變量格式 const類型名 指針變量名 可用其指向 常變量非常變量不能通過該指針改變其所指變量的值 該指針可以指向不同的變量 例 inta constintb 7 constint p p p 當(dāng)用指針變量作函數(shù)形參時 形參和實參的對應(yīng)關(guān)系形參實參指向非const型變量的指針非const變量的地址指向const型變量的指針const變量的地址非const變量的地址 函數(shù)中不能通過形參改變其所指實參的值 例 voidfun1 char p chara q fun1 例 voidfun2 constchar p chara t fun2 2 指向常對象的指針變量只能用指向常對象的指針變量指向常對象 指向常對象的指針變量即可指向常對象 也可指向非常對象 不能通過該指針改變對象 該指針變量本身可以改變 常用于函數(shù)形參 目的是保護(hù)形參指針?biāo)赶虻膶ο?使它在函數(shù)執(zhí)行過程中不被修改 即只想在函數(shù)中引用該對象 而不想改變它 例 Timet1 10 12 15 constTime p1 例 constTimet2 10 12 15 constTime p2 fun1 ABCp fun2 ABC p fun3 constABC P 指向常對象的指針fun4 ABC constp 常指針fun5 ABC 以 常引用方式 傳遞對象 p3不可被修改 向函數(shù)傳遞對象 六 指向?qū)ο蟪蓡T的指針對象成員的指針指向?qū)ο蟪蓡T的指針變量1 數(shù)據(jù)成員 公有 例 double p1 4 6友元 類的主要特點之一是數(shù)據(jù)隱藏 即類的私有成員只能在類定義的范圍內(nèi)使用 也就是說私有成員只能通過它的成員函數(shù)來訪問 但是 有時候需要在類的外部訪問類的私有成員 為此 就需要尋找一種途徑 在不放棄私有數(shù)據(jù)安全性的情況下 使得類外部的函數(shù)或類能夠訪問類中的私有成員 在C 中就用友元作為實現(xiàn)這個要求的輔助手段 C 中的友元為數(shù)據(jù)隱藏這堵不透明的墻開了一個小孔 外界可通過這個小孔窺視類內(nèi)部的秘密 友元是一扇通向私有成員的后門 友元既可以是不屬于任何類的一般函數(shù) 也可以是另一個類的成員函數(shù) 還可以是整個一個類 這樣 這個類中的所有成員函數(shù)都可以成為友元函數(shù) 一 友元函數(shù) 友元函數(shù)不是當(dāng)前類的成員函數(shù) 而

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論