c++面向對象程序設計
《c++面向對象程序設計》由會員分享,可在線閱讀,更多相關《c++面向對象程序設計(407頁珍藏版)》請在裝配圖網上搜索。
面向對象的設計思想 面向對象的思想最初出現(xiàn)于挪威奧斯陸大學和挪威計算機中心共同研制的 7語言中 , 隨著的0語言推出 , 面向對象的的程序設計方法得到了比較完善的實現(xiàn) 。 此后 , 面向對象的概念和應用已超越了程序設計和軟件開發(fā) , 擴展到如數據庫系統(tǒng) , 交互式界面 , 分布式系統(tǒng) , 網絡管理結構和人工智能等領域 。 面向對象的發(fā)展 面向對象思想 數據抽象 – 一種設計方法 把一組數據及作用與其上的操作組成一個設計實體或單位。接口說明外部可見,其實現(xiàn)是隱蔽的,不可見的。 發(fā)展的三個階段 01010101 100100 用戶 定義 抽象數 據類型 面向對象思想 抽象數據類型 抽象數據類型是指“一個值集和作用在該值集上的操作集”。抽象數據類型的定義只決定于其邏輯特性,與其具體的計算機內部實現(xiàn)無關。一個抽象數據類型可以分解為語法、語義、表示和算法 4個部分。 功能抽象 模塊 數據抽象 模塊 面向對象思想 抽象數據類型的實現(xiàn) 實現(xiàn)抽象數據類型需要借助于高級程序設計語言 ; 在面向過程的語言中,用戶可以自己定義數據類型 ; 在面向對象的程序設計語言中,借助于對象描述抽象數據類型。 (面向對象思想 問題求解 面向對象設計方法:實現(xiàn)問題空間和問題求解空間的近似和直接模擬。 意識部分 教室 物質部分 303教室 抽象部分 教室類 具體部分 一個對象:教室實例 現(xiàn)實問題空間 解空間 面向對象的特點 封裝機制 基于消息的通信 繼承機制 多態(tài)機制 理解面向對象的基本概念對于學習和掌握面向對象的開發(fā)方法是十分重要的。 面向對象的基本概念 類 ( 對象 (實例 (多態(tài)性 (繼承 ( 消息 (封裝 (面向對象的世界觀 把客觀世界從概念上看成是一個由相互配合而協(xié)作的對象所組成的系統(tǒng) 面向對象 =對象 +分類 +繼承 +通信 一個實例 ——椅子 對象:桌子 價格 尺寸 重量 位置 顏色 類:家具 對象:椅子 一個面向對象的實例 ——椅子 價格 尺寸 重量 位置 顏色 買 賣 移動 買 賣 移動 買 賣 移動 價格 尺寸 重量 位置 顏色 對象 對象 (對象是用來描述客觀存在的事物,它是構成系統(tǒng)的基本單位,是對客觀世界中事物的抽象描述。 對象 = 行為(功能、方法、服務) + 屬性(數據) 屬性 行為 接口 對象 對象 對象 面向對象的基本概念 對象是由私有數據(屬性)及作用于其上的一組操作(行為)所構成的一個封閉整體 由于對象的數據是私有的,所以要想訪問其數據的正確方法是向該對象發(fā)送消息,讓對象自身選擇其內部相應的操作以完成對該項數據的訪問 對象的動作取決于外界給對象的刺激,這就是消息,消息告訴對象所要求它完成的功能。對象具有一定的智能功能,即“知道”如何選擇相應的操作來處理對象所接收的消息 從設計人員的角度看,對象是一個完成特定功能的程序塊 從用戶的角度看,對象為他們提供了所希望的行為 面向對象的基本概念 對象 (對象標識 對象生命周期 面向對象的基本概念 類 ( 類 又稱 對象類 ( , 是 一組具有相同屬性和相同操作的對象的集合 。 在一個類中 , 每個對象都是類的 實例 (,它們都可以使用類中提供的函數 。 類具有屬性 , 用數據結構來描述類的屬性 , 類具有操作 , 它是對象的行為的抽象 , 操作實現(xiàn)的過程稱為方法 ( , 方法有方法名 , 方法體和參數 。 由于對象是類的實例,在進行分析和設計時,通常把注意力集中在類上,而不是具體的對象上。 幾何對象 顏色 位置 移動( 矢量) 選擇( P:指針型) :布爾型 旋轉 (角度 ) 圖 1 對象類的描述 人 姓 名 :字符串 年 齡 : 整 型 改換工作 改換地址 文件 文件名 文件大小 最近更新日期 打印 (人 ) 張紅兵 28 繪圖員 人民路 8號 (人 ) 李軍 24 程序員 無 圖 2 對象的描述 對象和類的描述 類和 對象一般采用 “ 名字 ” 、 ―屬性 ” 和 ―運算 ” 來描述 。 類名 屬性 運算 對象 類 屬于某類的具體對象就是該類的 實例 。 一個類的不同實例必定具有: 相同的操作(或行為)的集合 相同的信息結構或屬性定義,但可以有不同的屬性值 不同的對象標識 面向對象的基本概念 面向對象的基本概念 消息 (對象之間的聯(lián)系是通過傳遞消息來實現(xiàn)的。 消息 就是向對象發(fā)出的服務請求(互相聯(lián)系、協(xié)同工作等)。 是對象之間進行通訊的一種數據結構。 消息統(tǒng)一了“數據流”和“控制流”。 數據 方法 消息到達 面向對象的基本概念 消息 - 消息傳送與函數調用的區(qū)別 ( 1)函數調用可以帶或不帶參數,但是消息至少帶一個參數,它表明接收該消息的對象,消息中告訴對象做什么的部分稱為消息操作; ( 2)消息操作名類似于函數名,其本質區(qū)別在于:函數名代表一段可執(zhí)行的代碼,但消息操作名具體功能的選定還取決于接收消息的對象本身 ( 3)函數調用是過程式的(如何做),消息傳送是說明式的(做什么),具體如何做,由對象根據收到的消息自行確定。 繼承 ( 繼承是使用現(xiàn)存的定義作為基礎 , 建立新定義的技術 。 是父類和子類之間共享數據結構和方法的機制 ,這是類之間的一種關系 。 繼承性分: 單重繼承: 一個子類只有一個父類 。 即子類只繼承一個父類的數據結構和方法 。 多重繼承: 一個子類可有多個父類 。 繼承多個父類的數據結構和方法 。 基類 子類 A 子類 B 圖 4 繼承性描述 現(xiàn)存類定義 父類 (基類 ) 新類定義 子類 (派生類 ) 繼 承 圖 3 繼承性 繼承 單繼承 c c o u n b a la n n a m n u m b e r+ w i th d r a w ( )+ cr ea ta te m e n t( )繼承 多繼承 Fl y i n g T h i n g A n im a lH o r s eW o i r dH e li c o p t e rA i r p la n 裝 (封裝是一種信息隱蔽技術 , 就是把對象的屬性和行為相結合構成一個獨立的基本單位 , 用戶只能見到對象封裝界面上的信息 ,對象內部對用戶是隱蔽的 。 封裝的目的在于將對象的使用者和對象的設計者分開 , 使用者不必知道行為實現(xiàn)的細節(jié) , 只需使用設計者提供的消息訪問對象 面向對象的基本概念 封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。 面向對象的基本概念 … 公有消息 私有消息 存儲結構 方法 協(xié)..……議 一個對象 面向對象的基本概念 封裝的定義為: (1)一個限定所有對象內部軟件的一個清楚界面; (2)一個描述這個對象和其它對象之間相互作用的接口 (3)受保護的內部實現(xiàn),這個實現(xiàn)給出了由軟件對象提供的功能細節(jié),實現(xiàn)細節(jié)不能在定義這個對象的類的外面訪問 封裝 承 矛盾嗎? 封裝性主要指的是對象的封裝性,引入繼承機制后,對象仍然是封裝地很好的實體,其它對象與它通信只能發(fā)送消息。 相似性:共享代碼! 繼承:靜態(tài)共享代碼 封裝:動態(tài)共享代碼 面向對象的基本概念 多態(tài) (即一個 名字具有多種語義 。 同一對象接收到不同消息采用不同的行為方式 不同對象收到相同消息時產生不同的動作 重載( 動態(tài)綁定 類屬 多態(tài)性和動態(tài)綁定 多態(tài)性 (指相同的操作或函數 、過程作用于不同的對象上并獲得不同的結果 。 即相同的操作的消息發(fā)送給不同的對象時 , 每個對象將根據自己所屬類中定義的操作去執(zhí)行 , 產生不同的結果 。 例如: “ 繪圖 ” 操作 , 作用在 “ 橢圓 ” 和 “ 矩形 ” 上 , 畫出不同的圖形 。 動態(tài)綁定 (在運行時根據對象接收的消息動態(tài)地確定要連接的服務代碼 。 使用虛函數可實現(xiàn)動態(tài)聯(lián)編 , 不同聯(lián)編可以選擇不同的實現(xiàn) , 這便是多態(tài)性 。 繼承是動態(tài)聯(lián)編的基礎 , 虛函數是動態(tài)聯(lián)編的關鍵 。 多態(tài)性的實現(xiàn)舉例 實現(xiàn)多態(tài)性的基本步驟 (以 C++為例 ): (1)在基類中 , 定義成員函數為虛函數 ( (2)定義基類的公有 ( 派生類; (3)在基類的公有派生類中 “ 重載 ” 該虛函數; (4)定義指向基類的指針變量 , 它指向基類的公有派生類的對象 。 注意: 重載虛函數不是一般的重載函數 , 它要求函數名 、 返回類型 、 參數個數 、 參數類型和順序完全相同 。 多態(tài) 類與對象 C++語言程序設計 C++語言程序設計 本章主要內容 ? 面向對象的思想 ? ? 類概念和聲明 ? 對象 ? 構造函數 ? 析構函數 ? 內聯(lián)成員函數 ? 拷貝構造函數 ? 類的組合 C++語言程序設計 回顧:面向過程的設計方法 ? 重點 : – 如何實現(xiàn)細節(jié)過程,將數據與函數分開。 ? 形式: – 主模塊 +若干個子模塊( +子函數)。 ? 特點: – 自頂向下,逐步求精 ——功能分解。 ? 缺點: – 效率低,程序的可重用性差。 面向對象的思想 C++語言程序設計 面向對象的方法 ? 目的: – 實現(xiàn)軟件設計的產業(yè)化。 ? 觀點 :解決問題屬于自然界的。 – 自然界是由實體(對象)所組成。 ? 程序設計方法: – 使用面向對象的觀點來描述模仿并處理現(xiàn)實問題。 ? 要求: – 高度概括、分類、和抽象。 面向對象的思想 C++語言程序設計 ( 1)抽象 ? 抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質并加以描述的過程。(如學生,教師 , 課程) – 先注意問題的本質及描述,其次是實現(xiàn)過程或細節(jié)。 – 數據抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。 – 行為抽象:描述某類對象的共有的行為特征或具有的功能。 – 抽象的實現(xiàn):通過類的聲明。 ++語言程序設計 抽象實例 ——鐘表 ? 數據抽象: – 行為抽象: – , ++語言程序設計 抽象實例 ——鐘表類 –{ – – ; – – –}; ++語言程序設計 抽象實例 ——人 ?數據抽象: –行為抽象: –生物屬性角度: , , … –社會屬性角度: , ,… –注意:同一個問題可能有不同的抽象結果:根據解決問題的要求不同,產生的抽象成員可能不同 ++語言程序設計 (2) 封裝 ? 將抽象出的數據成員、行為成員相結合,將它們視為一個整體,即類。 – 目的是增強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪問權限,來使用類的成員。 – 實現(xiàn)封裝:類聲明中的 {} ++語言程序設計 封裝 ? 實例: – { – ; – – }; 邊界 特定的訪問權限 部接口 C++語言程序設計 ( 3)繼承與派生 ? 為了重用引出了繼函的概念。 ? 是 C++中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎上,進行更具體的說明。 ? 實現(xiàn):聲明派生類 ——第 11章 ? 昆蟲的分類樹 ++語言程序設計 多態(tài)性 ? 多態(tài):同一名稱,不同的功能實現(xiàn)方式。 ? 目的:達到行為標識統(tǒng)一,減少程序中標識符的個數。 ? 實現(xiàn):重載函數和虛函數 ——第 12章 ++語言程序設計 c++中的類 ? 類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內部包括屬性和行為兩個主要部分。 ? 利用類可以實現(xiàn)數據的封裝、隱藏、繼承與派生。 ? 利用類易于編寫大型復雜程序,其模塊化程度比 類 和 對 象 C++語言程序設計 類與函數 ? 函數是將邏輯上相關的 語句與數據 封裝,用于完成特定的功能。 ? 而類則是邏輯上相關的 函數與數據 的封裝,它是對所要處理的問題的描述。 類 和 對 象 C++語言程序設計 類的聲明形式 ? 類是一種用戶自定義類型,聲明形式: – 名稱 – { – – 公有成員(外部接口) – – 私有成員 – – 保護型成員 – } 類 和 對 象 C++語言程序設計 公有類型成員 ? 在關鍵字 們是類與外部的接口,任何外部函數都可以訪問公有類型數據和函數。 類 和 對 象 C++語言程序設計 私有類型成員 ? 在關鍵字 允許本類中的函數訪問,而類外部的任何函數都不能訪問。 ? 如果緊跟在類名稱的后面聲明私有成員,則關鍵字 類 和 對 象 C++語言程序設計 保護類型 ? 與 差別表現(xiàn)在繼承與派生時對派生類的影響不同, 第七章講 。 類 和 對 象 C++語言程序設計 類的成員 – { – ; – – – }; 類 和 對 象 成員數據 成員函數 ? : ? { ? ? ? ? } ? : ? { ? ? { ? ? ? ; ? ? ? }; ? ? { ? ? ? } C++語言程序設計 ? ? { ? x,y; ? ? a,b) ? { x=a; y=b; ? ?{ ? ? xx, ? ~; ? //..? ? ,; ?}; 構造函數和析構函數 ?xx,?{ X= Y=?} ?~ ?{ ?} ?//..41 C++語言程序設計 ? #? ? { ? x,y; ? ? Q(a=0,b=0) ? { ?I = ? 35; ? 20; ?//聲明類 其數據和方法 ?{ ? ? ? ? ? r); //構造函數 ? ? ; //圓周長 ? ; //圓面積 ?}; 43 ?// 類的實現(xiàn) ?// 構造函數初始化數據成員 r) ?{r} ?// 計算圓的周長 ? ?{ ? * ?} ? ?// 計算圓的面積 ? ?{ ? I * ?} 44 ?) ?{ ? ? ? ? // 提示用戶輸入半徑 ? ? // 聲明 象 ? ? 3); 45 ? // 計算柵欄造價并輸出 ? * ? ? #? ? ? ? ? ? r,i) ? {r;;} ? { ? { ? ? {t; ? t=? t); ? } ? }; ? ? { ? a; ? ? #? ? ? ? ? ? r,i) ? {r;;} ? { ? { ? ? {t; ? t=? t); ? } ? }; ? ? { ? a( ? #? ? ? ? ? ? r=0.0,i=? {r;;} ? { ? { ? ? {t; ? t=? t); ? } ? }; ? ? { ? a( ? b; ? c( ? #? ? ? ? ? ? r,i) ? {r;;} ? { ? { ? { ? ? {t; ? t=? t); ? } ? }; ? ? { ? a( ? #? ? ? ? ? ? r=0.0,i=? {r;;} ? ~ { #? ? ? ? ? ? r=0.0,i=? {r;;} ? c) ? { ? ~ { #? ? ? ? ? ? r=0.0,i=? {r;;} ? c) ? { ? ~ { #? ? ? ? ? ? r=0.0,i=? {r;;} ? c) ? { ? ~ { ? ? { ? , ) {X=Y=; } ? p); ? {;} ? {;} ? { ? { ? f(); ? g(); ? ? ? }; ? =0; ? f() ? { ;} ? g() ? { ? ? {? , ) {X==yy;;}? p); //拷貝構造函數 ? {;} ? {;} ? ? { {? ) ? { ? ? { ? i; //聲明 i ? i; //取 i=10; //? a[i]; ? a[i]; ? a[i]; ? – 相當于 (*; 指 針 C++語言程序設計 對象指針應用舉例 ? ?{ ? (5,10); ? ? A; ? x; ? x=; ? – =指 針 C++語言程序設計 指針變量作為函數實參 ? 以地址方式傳遞數據,可以用來返回函數處理結果。 ? 例如: 指針與函數 C++語言程序設計 例 ?{ ? ? *? *?} ? ?{ ? ? ?} C++語言程序設計 動態(tài)申請內存操作符 類型名 T(初值列表) ? 功能: 在程序執(zhí)行期間,申請用于存放 依初值列表賦以初值。 ? 結果值: 成功: 向新分配的內存。失?。?0( 動態(tài)存儲分配 C++語言程序設計 釋放內存操作符 針 P ? 功能: 釋放指針 動態(tài)存儲分配 C++語言程序設計 ? ? { ? ? i ; ? ? // is ? ; ? // ? i = 0; i > i] ; ? } ? // ? i=0; i ? ? { ? ? { X=Y=0; ? { //類的聲明同上例,略 }; ? ? { ]; //創(chuàng)建對象數組 ? ],10); //通過指針訪問數組元素的成員 ? ]5,20); //通過指針訪問數組元素的成員 ? ? ? // ? // (a) ? [; ? ? // (b) ? j = 0; j >b; – b>0) – { – c; – ...... – } –} – 具有塊作用域的變量也稱為局部變量。 作用域與可見性 C++語言程序設計 類作用域 ? 可以將類看成是一組有名成員的集合,除個別例外情況外,類作用域作用于特定的成員名,類及其對象有特殊的訪問和作用域規(guī)則。 ? 例:類 , 在 的函數成員中都可以訪問到 M, ? ( 1)即 ? ( 2)這樣的 ? 類的封裝作用就在于限制數據的作用域。 作用域與可見性 C++語言程序設計 類作用域 – 通過表達式 ::這是程序中訪問對象成員的最基本的方法。 X:: – 通過表達式 , 其中 作用域與可見性 C++語言程序設計 命名空間作用域 ? 一個大型的程序通常由不同模塊構成,不同的模塊甚至有可能是由不同人員開發(fā)的。不同模塊中的類和函數之間有可能發(fā)生重名,這樣就會引發(fā)錯誤。如南京路(上海的、武漢的) 作用域與可見性 C++語言程序設計 命名空間的語法形式: ? 名空間名 { ? 命名空間內的各種聲明(函數聲明、類聲明、 …… ) ? } ? 一個命名空間確定了一個命名空間作用域,凡是在該命名空間之內聲明的、不屬于前面所述各個作用域的標識符都屬于該命名空間作用域。在命名空間內部可以直接引用當命名空間中聲明的標識符,如果需要引用其他命名空間的標識符,需要使用下面的語法: ? 命名空間名 ::標識符名 ? 作用域與可見性 C++語言程序設計 ? 例: ? ); ? }; ? ? ? //聲明一個作用域與可見性 命名空間作用域 C++語言程序設計 ? 有時,在標識符前總使用這樣的命名空間限定會顯得過于冗長,為了解決這一問題, C++又提供了 ? 名空間名 ::標識符名; ? 名空間名; ? C++標準程序庫的所有標識符都被聲明在 此都使用了 ? ? 如果去掉這條語句,則引用相應的標識符需要使用 作用域與可見性 命名空間作用域 C++語言程序設計 ? 命名空間也允許嵌套,如: ? ? ? }; ? } ? } ? 引用其中的 要使用 作用域與可見性 命名空間作用域 C++語言程序設計 兩類特殊的命名空間 ? 全局命名空間 ? 匿名命名空間 ? 全局命名空間是默認的命名空間,在顯式聲明的命名空間之外聲明的標識符都在一個全局命名空間中(文件作用域)。 ? 匿名命名空間是一個需要顯式聲明的沒有名字的命名空間,聲明方式如下: ? ? 匿名命名空間內的各種聲明(函數聲明、類聲明、 …… ) ? } 作用域與可見性 C++語言程序設計 ? 在包含多個源文件的工程中,匿名命名空間常常被用來屏蔽不希望暴露給其他源文件的標識符,這是因為每個源文件的匿名命名空間是彼此不同的,在一個源文件中沒有辦法訪問其他源文件的匿名命名空間。例: 作用域與可見性 命名空間作用域 C++語言程序設計 ? #? ? i; //在全局命名空間的全局變量 (又稱文件作用域 ) ? s{ ? j; //在 ? } ? { ? i=5; //為全局變量 ? j=6; //為全局變量 ? { ? s; //使得當前塊中可以直接引用 名空間的標識符 ? i; //局部變量 ? i=7; ? – i; //文件作用域 ? j=3; – – { i=5; – { i; //塊作用域 – i=7; – – i=5; //文件作用域 – – { – k=3; – – ; – – { ; – ; – } – – { a=1; – i=5; – a++; – i++; – ? ? {? ;//構造函數 ? //三個形參均具有函數原型作用域 ? ; ? ~{}//析構函數 ? ? ? }; 對象的生存期 ? //時鐘類成員函數實現(xiàn) ? //構造函數 ? { ; ? ; ? ; ? } ? ? { ? ? ? } ? ? { ? f() ? { ;} ? g() ? { ? r); ? ? { d( ? d); ? ; ? } ? r) ? //常引用做形參,在函數中不能更新 ? { ? ? { ? R(R1=2= ? ; ? ? ? 1,? }; ? :: ? { ? ? {? A(i); ? ; ? r; ? ? a; ? b; //靜態(tài)常數據成員 ? }; ? ::b=10; ? A::A(i):a(i),r(a) {} ? :: ? { ?按標準方式搜索,文件位于 C++系統(tǒng)目錄的 – #件名 " ?首先在當前目錄中搜索,若沒有,再按標準方式搜索。 ? #定義指令 – 定義符號常量,很多情況下已被 – 定義帶參數宏,已被內聯(lián)函數取代。 ? # 刪除由 #之不再起作用。 C++語言程序設計 條件編譯指令 # # #常量表達式 ? //當“ 常量表達式”非零時編譯 ? 程序正文 ? # ...... 編譯預處理命令 C++語言程序設計 條件編譯指令 ——# # 常量表達式 ? //當“ 常量表達式”非零時編譯 – 程序正文 1 – # //當“ 常量表達式”為零時編譯 – 程序正文 2 – #譯預處理命令 C++語言程序設計 條件編譯指令 # # 常量表達式 1 ? 程序正文 1 //當“ 常量表達式 1”非零時編譯 ? #常量表達式 2 ? 程序正文 2 //當“ 常量表達式 2”非零時編譯 ? # 程序正文 3 //其它情況下編譯 ? #譯預處理命令 C++語言程序設計 條件編譯指令 ?# 標識符 ? 程序段 1 ?# 程序段 2 ?#如果“標識符”經 #未經 編譯程序段 1,否則編譯程序段 2。 編譯預處理命令 C++語言程序設計 條件編譯指令 ?# 標識符 ? 程序段 1 ?# 程序段 2 ?#如果“標識符”未被定義過,則編譯程序段 1,否則編譯程序段 2。 編譯預處理命令 C++語言程序設計 多文件結構 ? 一個源程序可以劃分為多個源文件: – 類聲明文件( – 類實現(xiàn)文件( – 類的使用文件( 所在的 ? 利用工程來組合各個文件。 C++語言程序設計 不使用條件編譯的頭文件 ? // #? #? ? { ? … ? } ? // #? … ? // #? … ? // … ? { ? … ? } ? … 多文件結構 C++語言程序設計 使用條件編譯的頭文件 ? // # # … ? { ?- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- c+ 面向 對象 程序設計
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.820124.com/p-3024.html