




已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
-1-,8.1 類是一種數據類型,數據類型約束了變量所能參加的運算范圍。例如,整型變量可以進行取?!?”運算,而實型變量則不可以進行該運算; 數據類型限定了變量所能取到的數值范圍。例如,整型變量可以取值為1,2, 100,,而不能取值3.1415這樣的實型數。 在C+中,類實際上相當于一種用戶自定義的數據類型,對象就是該數據類型的一個變量; 類-數據類型 對象-變量,-2-,8.2 類的定義,一個類表示現實生活中的一類事物,比如“學生”. 事物有相應的特征或屬性,它們就是類的成員數據; 事物可能有行為動作,也可能被某些行為動作所操作,這些都用函數來實現,是構成類的函數成員,或者叫成員函數。,-3-,8.2 類的定義,類的聲明具體說明類的組成,聲明類的語法形式為: class 類的名稱 public: 公有成員數據; 公有成員函數; protected: 保護成員數據; 保護成員函數; private: 私有成員數據; 私有成員函數; ;,-4-,其中,“成員”既可以是數據,也可以是函數。 成員數據的聲明方式與一般變量相同。 成員函數是描述類的對象可以進行的操作,一般在類中聲明原型,在類聲明的外面定義函數的具體實現。,8.2 類的定義,-5-,類的成員函數描述的是類的行為或操作。函數的原型聲明要在類的主體中,原型說明了函數的參數表和返回值類型。而函數的具體實現一般是寫在類聲明之外的。 在類的外部定義成員函數的語法形式為: 返回值類型 類名:成員函數名(參數表) 函數體 ,8.2 類的定義,-6-,定義一個類后,只是有了描述該類事物的數據類型。當我們使用“類”這個數據類型定義一個變量時,就生成了一個該“類”的對象。對象有時又稱為實例。 例如,Student stu(1,“wang”,M); 定義了一個對象名字為stu的Student類型的對象。,8.3 對象的定義,-7-,定義一個對象和定義一個一般變量相同。 定義變量時要分配存儲空間,同樣,定義一個對象時要分配存儲空間,一個對象所占的內存空間是類的數據成員所占的空間總和。類的成員函數存放在代碼區(qū)。 類的成員是抽象的,對象的成員才是具體的。類的數據成員都不會有具體的屬性值。只有對象的成員才會有具體的屬性值。,8.3 對象的定義,-8-,8.3 對象的定義,類中成員互訪 直接使用成員名 類外訪問 使用“對象名.成員名”方式訪問 public 屬性的成員,-9-,類的成員函數可以有多種特殊形式,包括帶默認參數值的成員函數、內聯成員函數和重載成員函數。,8.4 類的成員函數,-10-,class Student public: Student(int pId, char* pName, char pSex); / 構造函數 void printStudent(); / printStudent函數聲明 void setNationality(char* pNationality); / 設置國籍函數 private: int id; / 定義學號變量 char* name; / 定義姓名字符指針變量 char sex; / 定義性別變量 char* nationality; / 定義國籍字符指針變量 ;,8.4.1 帶默認參數值的成員函數,-11-,void Student:setNationality(char* pNationality=“China“) nationality = new charstrlen(pNationality)+1; if(nationality != 0) strcpy(nationality,pNationality); 調用: Student stu(1,“wang“,M); stu.setNationality();,8.4.1 帶默認參數值的成員函數,-12-,如果在類的內部定義成員函數的具體實現,則該成員函數為內聯成員函數。 函數定義時沒有任何的附加說明,所以稱為隱式聲明的內聯成員。,8.4.2 內聯成員函數,-13-,8.4.2 內聯成員函數,在類中說明原形,可以在類外給出函數體實現,并在函數名前使用類名加以限定。也可以直接在類中給出函數體,形成內聯成員函數。 在類中聲明內聯成員函數的方式: 將函數體放在類的聲明中(隱式)。 使用inline關鍵字(顯示)。,-14-,class Student public: void printStudent(); / 打印所有信息 / 根據flag取值打印不同信息 / flag=1, 打印id / flag=2, 打印name / flag=3, 打印sex / flag=4, 打印nationality void printStudent(int flag); private: ;,8.4.3 重載成員函數,-15-,關鍵字public、protected、private說明類成員的訪問控制屬性。私有(private)成員只允許本類的成員函數來訪問;公有(public)成員是類對外的接口,在類聲明和類(函數)實現之后,外部對象可以訪問公有成員。保護型(protected)成員的可訪問性和私有成員的性質相似,與繼承有關。,8.5 類成員的訪問屬性,-16-,關于訪問控制屬性,注意: 在類聲明中,三種訪問控制屬性,可以按任意次序出現,也可以不出現。public等關鍵字也可以多次出現,但是一個成員只能具有一種訪問控制屬性。 如果不寫訪問控制屬性關鍵字,默認的是private。在書寫時通常習慣將public放在最前面,這樣便于閱讀,因為它們是外部訪問時所要了解的。 一般情況下,一個類的數據成員應該聲明為私有成員,這樣封裝性較好。一個類應該有一些公有的函數成員,作為對外的接口,否則別的代碼無法訪問類,8.5 類成員的訪問屬性,-17-,8.5 類成員的訪問屬性,-18-,8.6 對象的使用,對象是類的一個具體的實例,類和對象的關系相當于普遍與特殊的關系。在C+中,類是一個自定義的數據類型,對象是該數據類型的一個變量。 所以,可以定義一個全局的對象,也可以在函數體中定義一個局部的對象,或者動態(tài)地從堆中申請空間來創(chuàng)建一個對象,還可以定義對象數組,以及使用對象作為函數的參數與返回值。,-19-,8.6.1 對象指針,聲明對象指針的一般語法形式為: 類名* 對象指針名; 使用對象指針訪問對象的成員,語法形式為: 對象指針名-公有成員; 例如: Clock c; Clock* pc1=new Clock; Clock* pc2=,-20-,8.6.2 this指針,問:一個類中所有對象調用的成員函數都執(zhí)行同一段代碼。那么,成員函數又是怎么識別當前是那個對象在訪問呢? 答:this指針指出了成員函數當前所操作的數據所屬的對象。不同的對象調用成員函數時,this指針將指向不同的對象,也就可以訪問不同對象的數據成員。,-21-,8.6.3 對象數組,對象數組的元素是對象,不僅具有數據成員,而且還有函數成員,可以通過數組元素調用成員函數。 例:student stu10;,-22-,8.6.4 對象用做函數的參數和返回值,可以將對象作為參數傳遞給一個函數或從函數返回一個對象。 直接用對象作為參數,調用函數時,進行值傳遞,實參的值要復制給形參,如果類的數據成員較多時,需要一一復制. 但是,這種參數傳遞方式效率不高,可以使用對象指針或對象引用方式來傳遞函數參數。,-23-,8.7 構造函數,構造函數的作用是在對象被創(chuàng)建時使用特定的值構造對象,或者說將對象初始化為一個特定的狀態(tài)。 在對象創(chuàng)建時由系統(tǒng)自動調用。 如果程序中未聲明,則系統(tǒng)自動產生出一個缺省形式的構造函數 允許為內聯函數、重載函數、帶缺省形參值的函數,-24-,8.7 構造函數,class Clock public: Clock (int NewH, int NewM, int NewS);/構造函數 Clock () /缺省構造函數 void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; ;,-25-,構造函數的實現: Clock:Clock(int H, int M, int S) Hour=H; Minute=M; Second=S; 建立對象時構造函數的作用: void main( ) Clock c(0,0,0); /隱含調用構造函數,將初始值作為實參。 c.ShowTime( ); ,-26-,8.7 構造函數,每個對象區(qū)別于其他對象的地方主要有兩個,外在的區(qū)別就是對象的標識符,即對象的名稱,而內在的區(qū)別就是對象自身的屬性值,即數據成員的值。 在定義一個對象的時候要給它分配存儲空間,也可以同時給它的數據成員賦初值,稱為對象的初始化。 C+程序中的對象初始化工作由一個特殊的成員函數來完成,就是構造函數。 因為不同類型的對象的初始化工作是不一樣的,因此構造函數從屬于某個類的,即每個類都要定義它自己的構造函數,它是類的成員函數。,-27-,定義構造函數的一般形式為: class 類名 public: 類名(形參表); /構造函數的原型 /類的其它成員 ; 類名:類名(形參表) /構造函數的實現 /函數體 ,8.7 構造函數,-28-,構造函數的特點是: 構造函數的函數名與類名相同;而且沒有返回值。 構造函數一定是公有函數。 作為類的成員函數,構造函數可以直接訪問類的所有數據成員。 在類的內部定義的構造函數是內聯函數。構造函數可以帶默認形參值,也可以重載。,8.7 構造函數,-29-,在聲明類時如果沒有定義類的構造函數,編譯系統(tǒng)就會在編譯時自動生成一個默認形式的構造函數; 默認構造函數是不提供參數的構造函數。,8.7 構造函數,-30-,8.8 析構函數,完成對象被刪除前的一些清理工作。 在對象的生存期結束的時刻系統(tǒng)自動調用它,然后再釋放此對象所屬的空間。 如果程序中未聲明析構函數,編譯器將自動產生一個缺省的析構函數。,-31-,構造函數和析構函數舉例,#include class Point public: Point(int xx,int yy); Point( ); /.其它函數原形 private: int X,int Y; ;,-32-,Point:Point(int xx,int yy) X=xx; Y=yy; Point:Point( ) /.其它函數的實現略,-33-,與構造函數相反,當對象生存期結束時,需要調用析構函數,釋放對象所占的內存空間。 與構造函數一樣,析構函數也是類的一個公有成員函數,它的名稱是在類名前加“”構成,沒有返回值,和構造函數不同的是析構函數不接受任何參數,析構函數是不可重載的。 析構函數是在對象生存期即將結束的時刻由系統(tǒng)自動調用的。如果程序員沒有定義析構函數,系統(tǒng)將自動生成和調用一個默認析構函數。,8.8 析構函數,-34-,拷貝構造函數就是函數的形參是類的對象的引用的構造函數。 通過等于號復制對象時,系統(tǒng)會自動調用拷貝構造函數。 如果程序在類定義時沒有顯式定義拷貝構造函數,系統(tǒng)也會自動生成一個默認的拷貝構造函數,把成員值一一復制。 拷貝構造函數與原來的構造函數實現了函數的重載。,8.9 拷貝構造函數,-35-,以下三種情況系統(tǒng)會自動調用拷貝構造函數: 當用類的一個對象去初始化該類的另一個對象時 如果函數的形參是類的對象,為值傳遞,調用函數時,進行形參和實參結合時 如果函數的返回值是類的對象,函數執(zhí)行完成返回調用者時,8.9 拷貝構造函數,-36-,拷貝構造函數,拷貝構造函數是一種特殊的構造函數,其形參為本類的對象引用。 class 類名 public : 類名(形參);/構造函數 類名(類名 &對象名);/拷貝構造函數 . ; 類名: 類名(類名 &對象名)/拷貝構造函數的實現 函數體 ,-37-,例 拷貝構造函數舉例,當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調用它實現拷貝賦值。 void main(void) Point A(1,2); Point B(A); /拷貝構造函數被調用 coutB.GetX( )endl; ,-38-,拷貝構造函數舉例,若函數的形參為類對象,調用函數時,實參賦值給形參,系統(tǒng)自動調用拷貝構造函數。例如: void fun1(Point p) coutp.GetX( )endl; void main( ) Point A(1,2); fun1(A); /調用拷貝構造函數 ,-39-,拷貝構造函數舉例,當函數的返回值是類對象時,系統(tǒng)自動調用拷貝構造函數。例如: Point fun2( ) Point A(1,2); return A; /調用拷貝構造函數 void main( ) Point B; B=fun2( ); ,-40-,完成簡單的一一對應的復制的拷貝構造函數稱為淺拷貝。 如果類的數據成員包括指針變量,類的構造函數用new運算符為這個指針動態(tài)申請空間。如果通過淺拷貝進行了對象的復制。最后,在退出運行時,程序會報錯。這時需要用“深拷貝”的方式恰當定義類的拷貝構造函數。 一般來講,如果一個類需要析構函數來釋放資源,則它也需要定義一個顯式拷貝構造函數來實現深拷貝。,8.10 淺拷貝與深拷貝,-41-,靜態(tài)成員,靜態(tài)數據成員 用關鍵字static聲明 該類的所有對象維護該成員的同一個拷貝 必須在類外定義和初始化,用(:)來指明所屬的類。 靜態(tài)成員函數 類外代碼可以使用類名和作用域操作符來調用靜態(tài)成員函數。 靜態(tài)成員函數只能引用屬于該類的靜態(tài)數據成員或靜態(tài)成員函數。,-42-,8.11.1 靜態(tài)成員數據,靜態(tài)成員數據是類的數據成員的一種特例,采用static關鍵字來聲明。 類的數據成員在類的每一個對象中分別存儲不同的數值,但是靜態(tài)成員數據則不同,它在整個類中只有一個拷貝,由該類的所有對象共同維護和使用,從而實現了同一類的不同對象之間的數據共享。 靜態(tài)數據成員具有靜態(tài)生存期。 在類的聲明中只能聲明靜態(tài)成員數據的存在。由于類的聲明是抽象的,靜態(tài)成員數據的初始化需要在類的外部進行,通過類名對它進行訪問。,-43-,8.11.2 靜態(tài)成員函數,可以通過定義和使用靜態(tài)成員函數來訪問靜態(tài)數據成員。 所謂靜態(tài)成員函數就是使用static關鍵字聲明函數成員。同靜態(tài)數據成員一樣,靜態(tài)成員函數也屬整個類,由同一個類的所有對象共同維護,為這些對象所共享。,-44-,8.11.2 靜態(tài)成員函數,靜態(tài)成員函數作為成員函數,它的訪問屬性可以受到類的嚴格控制。對公有靜態(tài)成員函數,可以通過類名或對象名來調用;而一般的非靜態(tài)公有成員函數只能通過對象名來調用。 靜態(tài)成員函數可以直接訪問該類的靜態(tài)數據成員和函數成員;而訪問非靜態(tài)數據成員,必須通過參數傳遞方式得到對象名,然后通過對象名來訪問。,-45-,8.12 友元,在程序設計中,將數據與操作數據的行為進行有機地結合,這就是封裝。 C+語言提供類實現封裝,類是屬性和操作的結合體,并且在定義類的屬性和操作時,規(guī)定了它們的可見性。 通過封裝將一部分成員作為類與外部的接口,而將其它的成員隱藏起來,以防外界的干擾和誤操作,使程序的不同模塊之間的相互影響減小到最低限度。,-46-,8.12.1 友元函數,友元函數是在類聲明中由關鍵字friend修飾說明的非成員函數,在它的函數體中能夠通過對象名訪問 private 和 protected成員 作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。 訪問對象中的成員必須通過對象名。,-47-,例. 使用友元函數計算兩點距離,#include #include class Point /Point類聲明 public: /外部接口 Point(int xx=0, int yy=0) X=xx;Y=yy; int GetX( ) return X; int GetY( ) return Y; friend double Distance(Point ,-48-,double Distance( Point ,-49-,8.12.1 友元類,若一個類為另一個類的友元,則此類的所有成員都能訪問對方類的私有成員。 聲明語法:將友元類名在另一個類中使用friend修飾說明。,-50-,友元類舉例,class A friend class B; public: void Display( ) coutxendl; private: int x; class B public: void Set(int i); void Display( ); private: A a; ;,-51-,void B:Set(int i) a.x=i; void B:Display( ) a.Display( ); ,-52-,關于友元類,要注意: 友元關系是不能傳遞的。B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒有聲明,就沒有任何友元關系,不能進行數據共享。 友元關系是單向的。如果聲明B類是A類的友元,B類的成員函數就可以訪問A類的私有和保護數據,但A類的成員函數卻不能訪問B類的私有和保護數據。,8.13 常對象,-54-,8.13 常對象,定義對象時用const進行修飾,稱為常對象,它的數據成員值在對象的整個生存期間內不能被改變。也就是說,常對象在定義時必須進行初始化,而且不能被更新。 使用常量,既實現了數據共享、又可以保證數據不會被改變。,class A public: A(int i,int j) x=i; y=j; . private: int x,y; ; A const a(3,4); /a是常對象,不能被更新,8.14 常成員,-56-,8.14 常成員,對于類的某個成員函數,使用const關鍵字修飾,稱為常成員函數。常對象只能調用常成員函數,保證常對象的數據成員不能被修改。 使用const說明的數據成員稱為常數據成員。如果在一個類中說明了常數據成員,那么任何函數中都不能對該成員賦值。,常成員函數說明格式: 類型說明符 函數名(參數表)const; 1)const是函數類型的一個組成部分,因此在實現 部分也要帶const關鍵字。 2)const關鍵字可以被用于參與對重載函數的區(qū)分 3)常對象只能調用常成員函數;但是普通對象也可以 調用常成員函數,使用const說明的數據成員。格式如下: const 類型說明符 數據成員名;,-57-,例 常成員函數舉例,#include class R public: R(int r1, int r2)R1=r1;R2=r2; void print( ); void print( ) const; private: int R1,R2; ;,-58-,例 常數據成員舉例,#include class A public: A(int i); void print( ); const int,-59-,8.14 常成員,常成員函數的特點: const是函數類型的一個組成部分,在函數實現時也要帶const關鍵字。 常成員函數不能更新對象的數據成員,也不能調用該類中的非常成員函數。 常對象只能調用常成員函數,但是常成員函數也可以被普通對象來調用。 const關鍵字可以被用于參與對重載函數的區(qū)分。,8.15 組合關系,-61-,8.15 組合關系,現實世界中對象與對象之間的整體-部分關系又稱為組合關系。生活中有很多這方面的實例。例如,一輛汽車由四個車輪、一個方向盤和一個發(fā)動機等部件組成,一個桌子有一個桌面和四個桌腿組成。那么,汽車對象和車輪對象、方向盤對象以及發(fā)動機對象之間就構成了組合關系,桌子對象和桌面對象以及桌腿對象之間也構成了組合關系。,-62-,8.15 組合關系,-63-,8.15 組合關系,#include using namespace std; class Tyre / 輪胎類Tyre的定義 public: Tyre() cout“Constructing one Tyre.“endl; private: float maxSpeed; / 最大速度 int loadIndex; / 載重指數 float diameter; / 直徑 char spec20; / 規(guī)格 char company20; / 生產廠家 ;,-64-,8.15 組合關系,class SteeringWheel / 方向盤類SteeringWheel的定義 public: SteeringWheel() cout“Constructing one SteeringWheel.“endl; private: int color; / 顏色 char material20; / 材質 char type10; / 類型 char company20; / 生產廠家 ;,-65-,8.15 組合關系,class Motor / 發(fā)動機類Motor的定義 public: Motor() cout“Constructing one Motor.“endl; private: float gasDischarge; / 排氣量 float oilConsume; / 耗油量 float power; / 功率 float zip; / 壓縮比 char company20; / 生產廠家 ;,-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肺源性心臟病的健康指導
- 慧智教育平臺介紹
- 口腔健康衛(wèi)生宣教
- 膿毒血癥疑難病例診療分析
- 超聲刀核心技術與臨床應用
- 企業(yè)數字化架構治理頂層規(guī)劃
- 確保經濟社會持續(xù)健康發(fā)展
- 2025年冷陰極材料項目提案報告
- 2025年熔接機項目規(guī)劃申請報告
- 2025年藥效學研究服務項目申請報告
- 2025年安全管理員安全培訓考試試題附參考答案(綜合題)
- 河南省新鄉(xiāng)市2023-2024學年高一物理下學期7月期末考試含答案
- 湖南省益陽市赫山區(qū)2023-2024學年三年級下學期語文期末教學質量檢測試卷(含答案)
- 【詩歌鑒賞】2025屆高三下4月名校??荚囶}
- 2025年人教版PEP五年級英語下冊期末試卷(含答案含聽力原文無聽力音頻)
- 浙商車險合同協(xié)議
- 2025怎樣正確理解全過程人民民主的歷史邏輯、實踐邏輯與理論邏輯?(答案3份)
- 互聯網居家護理服務匯報
- 電工外聘協(xié)議書范本
- 樹脂瓦施工方案
- 山東省濟南市歷城區(qū)2024-2025學年數學五下期末調研試題含答案
評論
0/150
提交評論