C++-程序設(shè)計(jì)題解與上機(jī)指導(dǎo).ppt_第1頁
C++-程序設(shè)計(jì)題解與上機(jī)指導(dǎo).ppt_第2頁
C++-程序設(shè)計(jì)題解與上機(jī)指導(dǎo).ppt_第3頁
C++-程序設(shè)計(jì)題解與上機(jī)指導(dǎo).ppt_第4頁
C++-程序設(shè)計(jì)題解與上機(jī)指導(dǎo).ppt_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余102頁可下載查看

下載本文檔

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

文檔簡介

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論