類與對象(c++).ppt_第1頁
類與對象(c++).ppt_第2頁
類與對象(c++).ppt_第3頁
類與對象(c++).ppt_第4頁
類與對象(c++).ppt_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章類與對象 7 1類 對象及數(shù)據(jù)封裝7 2構(gòu)造函數(shù) 析構(gòu)函數(shù) 成員函數(shù) 靜態(tài)成員與友元 教學(xué)目標 1掌握類及對象的概念 類與對象的關(guān)系 類與對象的差異2掌握構(gòu)造函數(shù) 析構(gòu)函數(shù)的作用及定義3了解靜態(tài)成員 友元等概念 教學(xué)重點 1 類和對象概念和定義 2 構(gòu)造函數(shù)和析構(gòu)函數(shù)解析 教學(xué)難點 構(gòu)造函數(shù) 析構(gòu)函數(shù) 第7章類與對象 7 1類的定義 7 1 1類的定義7 1 2類成員的訪問控制7 1 3類的成員函數(shù)7 1 4對象 7 1 1類的定義 類的引入 類是一種由用戶定義的復(fù)雜數(shù)據(jù)類型 它是將不同類型的數(shù)據(jù)及相關(guān)的操作封裝在一起的集合體 描述客觀事物時 必須用不同的數(shù)據(jù)類型來描述事物各個不同的方面 如一種商品 商品名稱 用字符串描述 該商品數(shù)量 用整型數(shù)描述 該商品單價 用浮點數(shù)描述 該商品總價 用浮點數(shù)描述 這里用了屬于三種不同數(shù)據(jù)類型的四個數(shù)據(jù)成員來描述一種商品 7 1 1類的定義 類的定義的一般格式 說明部分class public protected private 實現(xiàn)部分 7 1 1類的定義 類的表述 classGoods private charname 21 intamount floatprice floattValue public setPrice intp 最后的分號不可少 這是一條說明語句關(guān)鍵字class是數(shù)據(jù)類型說明符 指出下面說明的是類 標識符Goods是商品這個類的類型名 花括號中是構(gòu)成類體的系列成員 關(guān)鍵字public是一種訪問限定符 7 1 1類的定義 類定義語法格式 class類名 private 成員表1 public 成員表2 protected 成員表3 注意 所有說明都以分號結(jié)束其中 class類名 稱為類頭 花括號中的部分稱為類體 類體中定義了類成員表 包含數(shù)據(jù)和函數(shù) 7 1 1類的定義 成員函數(shù) classGoods private charname 21 intamount floatprice floattValue public voidregisterGoods char int float 輸入數(shù)據(jù)voidcountTotal void 計算商品總價值voidgetName char 讀取商品名intgetAmount void 讀取商品數(shù)量floatgetPrice void 讀取商品單價floatgetTvalue void 讀取商品總價值 7 1 1類的定義 封裝 類把數(shù)據(jù) 事物的屬性 和函數(shù) 事物的行為 操作 封裝為一個整體 接口 通常數(shù)據(jù)成員被說明成私有的 函數(shù)成員被說明成公有的 從外部對數(shù)據(jù)成員進行操作 只能通過公有函數(shù)來完成 從而使數(shù)據(jù)受到了良好的保護 不易受副作用的影響 公有函數(shù)集定義了類的接口 成員函數(shù)可以直接訪問類定義中的任一成員 可以處理數(shù)據(jù)成員 也可調(diào)用成員函數(shù) 注意 類是一種數(shù)據(jù)類型 定義時系統(tǒng)不為類分配存儲空間 所以不能對類的數(shù)據(jù)成員初始化 類中的任何數(shù)據(jù)成員也不能使用關(guān)鍵字extern auto或register限定其存儲類型 7 1 2類成員的訪問控制 訪問限定符 public 公共的 說明的成員能從外部進行訪問 private 私有的 和protected 保護的 說明的成員不能從外部進行訪問 每種說明符可在類體中使用多次 訪問限定符的作用域是從該說明符出現(xiàn)開始到下一個說明符之前或類體結(jié)束之前結(jié)束 如果在類體起始點無訪問說明符 系統(tǒng)默認定義為私有 private 訪問限定符private protected體現(xiàn)了類具有封裝性 7 1 3類的成員函數(shù) 成員函數(shù)定義 成員涵數(shù)用來描述事物的行為 成員涵數(shù)的說明必須在類體中進行 但定義既可以在類體中進行 也可以在類體外進行 1 通常在類定義中 成員函數(shù)僅作聲明 函數(shù)定義通常在類的說明之后進行 其格式如下 返回值類型類名 函數(shù)名 參數(shù)表 函數(shù)體其中運算符 稱為作用域運算符 它指出該函數(shù)是屬于哪一個類的成員函數(shù) 2 另一種方式是對成員涵數(shù)進行說明后 緊接著進行成員涵數(shù)的定義 classGoods private charname 21 intamount floatprice floattValue public floatgetPrice floatgetTvalue voidsetPrice intp price p floatGoods getPrice return Price floatGoods getTvalue return tValue 7 1 3類的成員函數(shù) 7 1 4對象的定義 定義對象 對象是類的實例 instance 定義一種數(shù)據(jù)類型只是告訴編譯系統(tǒng)該數(shù)據(jù)類型的構(gòu)造 并沒有分配內(nèi)存 類只是一個樣板 以此樣板可以在內(nèi)存中開辟出同樣結(jié)構(gòu)的實例 對象 一個對象必須屬于一個已知的類 7 1 4對象的定義 定義對象的格式如下 其中 類名 為對象所屬的類的名稱 對象名 合法的C 標識符 可以一次定義多個對象 參數(shù)表 為初始化對象時所需要的參數(shù) 例如 Goodscar 這個定義創(chuàng)建了Goods類的一個對象car 同時為它分配了屬于它自己的存儲空間 用來存放數(shù)據(jù)和對這些數(shù)據(jù)實施操作的成員函數(shù) 代碼 對象存儲 圖7 1各對象完全獨立地安排內(nèi)存的方案 圖7 1是系統(tǒng)為每一個對象分配了全套的內(nèi)存 數(shù)據(jù)區(qū)安放數(shù)據(jù)成員 代碼區(qū)安放成員函數(shù) 注意 區(qū)別同一個類的各個不同的對象的屬性是由數(shù)據(jù)成員決定的 不同對象的數(shù)據(jù)成員的內(nèi)容是不一樣的 而行為 操作 是用函數(shù)來描述的 這些操作的代碼對所有對象都是一樣的 7 1 4對象的定義 圖7 2各對象的代碼區(qū)共用的方案 圖7 2僅為每個對象分配一個數(shù)據(jù)區(qū) 代碼區(qū) 存放成員函數(shù)的區(qū)域 為各對象類共用 圖7 1對應(yīng)的是在類說明中定義函數(shù) 而圖7 2對應(yīng)的是在類說明外部定義函數(shù) 7 1 4對象的定義 7 1 4對象的定義 對象的成員就是用來創(chuàng)建該對象的類所定義的成員 包括數(shù)據(jù)成員和成員涵數(shù)創(chuàng)建對象之后 就可以使用 和 來訪問對象的數(shù)據(jù)成員和成員涵數(shù) 一般格式如下 數(shù)據(jù)成員名 成員涵數(shù)名 參數(shù)表 或者 成員涵數(shù)名 參數(shù)表 對象使用規(guī)則 只要在對象名后加點號 點操作符 再加數(shù)據(jù)成員或成員函數(shù)名就可以了 但是這些成員必須是公有的成員 只有公有成員才能在對象的外面對它進行訪問 例7 1 中對象car的4個數(shù)據(jù)成員全是私有的 如寫 car name car amount car price car tValue 是錯誤的 必須用對象car所帶的公有函數(shù)進行訪問 7 1 4對象的定義 7 2構(gòu)造函數(shù)和析構(gòu)函數(shù) 7 2 1構(gòu)造函數(shù)7 2 2析構(gòu)函數(shù)7 2 3拷貝構(gòu)造函數(shù)7 2 4靜態(tài)成員7 2 5友元函數(shù) 7 2 1構(gòu)造函數(shù) 數(shù)據(jù)成員多為私有的 要對它們進行初始化 必須用一個公有函數(shù)來進行 同時這個函數(shù)應(yīng)該在且僅在定義對象時自動執(zhí)行一次 這個函數(shù)被稱為 構(gòu)造函數(shù) constructor 構(gòu)造涵數(shù)的作用是 在對象被創(chuàng)建時用特定的值構(gòu)造對象 將對象初始化為一種特定的狀態(tài) 使該對象具有不同于其他對象的特征 構(gòu)造涵數(shù)由系統(tǒng)自動調(diào)用 7 2 1構(gòu)造函數(shù) 構(gòu)造函數(shù)特征 1 函數(shù)名與類名相同 2 構(gòu)造函數(shù)無函數(shù)返回類型說明 注意是什么也不寫 也不可寫void 3 在程序運行時 當新的對象被建立時 該對象所屬的類的構(gòu)造函數(shù)自動被調(diào)用 在該對象生存期中也只調(diào)用這一次 4 構(gòu)造函數(shù)可以重載 嚴格地講 說明中可以有多個構(gòu)造函數(shù) 它們由不同的參數(shù)表區(qū)分 系統(tǒng)在自動調(diào)用時按一般函數(shù)重載的規(guī)則選一個執(zhí)行 7 2 1構(gòu)造函數(shù) 5 構(gòu)造函數(shù)可以在類中定義 也可以在類外定義 6 如果類說明中沒有給出構(gòu)造函數(shù) 則C 編譯器自動給出一個默認的構(gòu)造函數(shù) 類名 void 但只要我們定義了一個構(gòu)造函數(shù) 系統(tǒng)就不會自動生成默認的構(gòu)造函數(shù) 只要構(gòu)造函數(shù)是無參的或各參數(shù)均是有默認值的 C 編譯器都認為是默認的構(gòu)造函數(shù) 并且默認的構(gòu)造函數(shù)只能有一個 7 2 1構(gòu)造函數(shù) Goods的構(gòu)造函數(shù) 三參數(shù) Goods char n inta floatp strcpy name n amount a price p tValue price amount 兩參數(shù) 貨名和單價 Goods char n floatp strcpy name n price p amount 0 tValue 0 0 默認的構(gòu)造函數(shù) Goods name 0 0 price 0 0 amount 0 tValue 0 0 這三個構(gòu)造函數(shù)同時被說明 重載 7 2 1構(gòu)造函數(shù) 構(gòu)造函數(shù)應(yīng)用 Goodscar1 夏利2000 30 98000 0 調(diào)用了Goods中的第一個構(gòu)造函數(shù) 等效于 Goodscar1 Goods 夏利2000 30 98000 0 Goodscar2 桑塔那2000 164000 0 調(diào)用的是第二個構(gòu)造函數(shù) 參數(shù)為兩個 Goodscar3 定義時調(diào)用不帶參數(shù)的構(gòu)造函數(shù)但是定義對象時不能加括號 例如 Goodscar4 car4 是不帶參數(shù)的函數(shù) 它的返回值是類Goods的對象 7 2 2析構(gòu)函數(shù) 析構(gòu)函數(shù) destructor 特征 當一個對象的生命周期結(jié)束時 C 會自動調(diào)用析構(gòu)函數(shù) destructor 對該對象進行善后工作 1 構(gòu)函數(shù)名與類名相同 但在前面加上字符 如 Goods 2 析構(gòu)函數(shù)無函數(shù)返回類型 與構(gòu)造函數(shù)在這方面是一樣的 但析構(gòu)函數(shù)不帶任何參數(shù) 3 一個類有一個也只有一個析構(gòu)函數(shù) 這與構(gòu)造函數(shù)不同 析構(gòu)函數(shù)可以默認 4 對象注銷時 系統(tǒng)自動調(diào)用析構(gòu)函數(shù) 7 2 3拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù)的引入 同一個類的對象在內(nèi)存中有完全相同的結(jié)構(gòu) 如果作為一個整體進行復(fù)制是完全可行的 這個復(fù)制過程只需要復(fù)制數(shù)據(jù)成員 而成員函數(shù)是共用的 只有一份代碼 在建立對象時可用同一類的另一個對象來初始化該對象 這時所用的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù) CopyConstructor 故 拷貝構(gòu)造涵數(shù)是用一個已知的對象來初始化一個正在創(chuàng)建的同類對象 7 2 3拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù)的一般格式 const 涵數(shù)體 特征 是一種構(gòu)造涵數(shù) 與類名同名 不指定返回值類型 只有一個參數(shù) 且該參數(shù)是同類對象的引用 每一個類都必須有一個拷貝構(gòu)造涵數(shù) 若類中沒有定義拷貝構(gòu)造涵數(shù) 則系統(tǒng)自動生成一個公有的拷貝構(gòu)造涵數(shù) 7 2 3拷貝構(gòu)造函數(shù) 例如 Goods constGoods 7 2 3拷貝構(gòu)造函數(shù) 實拷貝構(gòu)造涵數(shù)的調(diào)用實例 Goodscar1 夏利2000 30 98000 00 調(diào)用三個參數(shù)的構(gòu)造函數(shù)Goodscar2 car1 調(diào)用拷貝構(gòu)造函數(shù)Goodscar3 car1 調(diào)用拷貝構(gòu)造函數(shù) car1為實參這樣三個對象的初始化結(jié)果完全一樣 注意 在類定義中如果沒有顯式給出構(gòu)造函數(shù)時 并不是不用構(gòu)造函數(shù) 而是由系統(tǒng)自動調(diào)用默認的構(gòu)造函數(shù)或默認的拷貝構(gòu)造函數(shù) 如果有程序設(shè)計者定義的構(gòu)造函數(shù) 包括拷貝構(gòu)造函數(shù) 則按函數(shù)重載的規(guī)律 調(diào)用合適的構(gòu)造函數(shù) 7 2 4靜態(tài)數(shù)據(jù)成員 靜態(tài)數(shù)據(jù)成員定義與使用 在類定義中 用關(guān)鍵字static修飾的數(shù)據(jù)成員為靜態(tài)數(shù)據(jù)成員 該類所有對象共享由系統(tǒng)為靜態(tài)成員分配的一個存儲空間 而這個存儲空間是在編譯時分配的 在定義對象時不再為靜態(tài)成員分配空間 靜態(tài)數(shù)據(jù)是該類所有對象所共有的 可提供同一類的所有對象之間信息交換的捷徑 7 2 4靜態(tài)數(shù)據(jù)成員 靜態(tài)數(shù)據(jù)成員定義與使用 靜態(tài)數(shù)據(jù)成員屬于整個類 使用時可用以下格式 類名 靜態(tài)數(shù)據(jù)成員名 在類的外部使用時注意 1 靜態(tài)數(shù)據(jù)成員在類中聲明 但不能在其中定義 2 靜態(tài)數(shù)據(jù)成員的初始化不能在構(gòu)造函數(shù)中進行 7 2 4靜態(tài)數(shù)據(jù)成員 例7 3 用靜態(tài)數(shù)據(jù)成員計算由同一類建立的對象的數(shù)量執(zhí)行程序后輸出 對象數(shù)量 1 a 0 構(gòu)造函數(shù)產(chǎn)生對象數(shù)量 2 a 1 構(gòu)造函數(shù)產(chǎn)生對象數(shù)量 3 a 2 構(gòu)造函數(shù)產(chǎn)生對象數(shù)量 2 a 2 析構(gòu)函數(shù)產(chǎn)生對象數(shù)量 1 a 1 析構(gòu)函數(shù)產(chǎn)生對象數(shù)量 0 a 0 析構(gòu)函數(shù)產(chǎn)生 7 2 4靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的引入 當一個函數(shù)不需要訪問類中除靜態(tài)數(shù)據(jù)成員之外的數(shù)據(jù)時 我們可以將其定義為靜態(tài)成員函數(shù) 一般情況下 靜態(tài)成員函數(shù)只能訪問類中的靜態(tài)數(shù)據(jù)成員 靜態(tài)成員函數(shù)是被一個類中所有對象共享的成員函數(shù) 不屬于哪個特定的對象 7 2 4靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的使用 將成員函數(shù)說明為靜態(tài) 使該成員函數(shù)與該類的不同對象無關(guān) 靜態(tài)成員函數(shù)的調(diào)用 在對象之外可以采用下面的方式 類名 函數(shù)名 對象名 參數(shù)表 或者任一類對象名 函數(shù)名 對象名 參數(shù)表 靜態(tài)函數(shù)成員多為公有的 7 2 4靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的使用實例 在下面的程序中 將使用類Car為自己的每一個對象提供了對象ID號 創(chuàng)建或銷毀對象時 將有一靜態(tài)數(shù)據(jù)成員記錄程序中的對象數(shù) 執(zhí)行結(jié)果是顯示對象ID及對象數(shù) 7 2 4靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的使用實例 includeclassCar private staticintcounter 靜態(tài)數(shù)據(jù)成員intid public Car 構(gòu)造函數(shù) Car 析構(gòu)函數(shù)staticvoiddisplay 靜態(tài)成員函數(shù)voiddisplayID 7 2 4靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的使用實例 intCar counter 0 定義靜態(tài)數(shù)據(jù)成員Car Car counter id counter Car Car counter cout Objectnumber id beingdestroyed voidCar display staticfunction cout Numberofobjectscreatedis counter endl voidCar displayID cout ObjectIDis id endl 7 2 4靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的使用實例 intmain Cara1 Car display Cara2 a3 Car display a1 displayID a2 displayID a3 displayID return0 在C 中 友元 friend 函數(shù)允許在類外訪問該類中的任何成員 就象成員函數(shù)一樣 友元函數(shù)用關(guān)鍵字friend說明 由于類的封裝性 只有類的成員涵數(shù)才能訪問類的私有成員 而外部涵數(shù)只能訪問類的公有成員 但有時需要在類的外部訪問類的私有成員 以減少使用類的成員涵數(shù)訪問私有成員而帶來的參數(shù)傳遞 類型檢查 安全性檢查的時間開銷 7 2 5友元函數(shù) 7 2 5友

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論