




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四章類和對象C++本章主要內容類及其實例化構造函數析構函數this指針類和對象的性質面向對象的標記圖
類是一種復雜的數據類型,它是將不同類型的數據和與這些數據相關的運算封裝在一起,使類中的數據得到很好的“保護”.
類是具有相同屬性和行為的一組對象的集合,為屬于該類的全部對象提供了統(tǒng)一的抽象描述.1.類的定義
類的定義格式:class類名{private:
成員數據;
成員函數;
public:
成員數據;
成員函數;
protected:
成員數據;
成員函數;};關鍵字類名私有公有保護classStudent{private:intnum;charname[20];charsex; public:voidStudent::display(){ cout<<“num:”<<num<<endl; cout<<“name:”<<name<<endl; cout<<“sex:”<<sex
<<endl;}};分號不能少類的定義private限定用關鍵字private限定的成員稱為私有成員,對私有成員限定在該類的內部使用,即只允許該類中的成員函數使用私有的成員數據,對于私有的成員函數,只能被該類內的成員函數調用;類就相當于私有成員的作用域.
類的定義public限定用關鍵字public限定的成員稱為公有成員,公有成員的數據或函數不受類的限制,可以在類內或類外自由使用;對類而言是透明的.類的定義protected限定用關鍵字protected所限定的成員稱為保護成員,只允許在類內及該類的派生類中使用保護的數據或函數.即保護成員的作用域是該類及該類的派生類.類的定義私有成員公有成員保護成員類內函數可以調用可以調用可以調用類外函數不可調用可以調用不可調用私有函數公有函數保護函數類內函數可以調用可以調用可以調用類外函數不可調用可以調用不可調用類的定義每一個限制詞(private等)在類體中可使用多次.一旦使用了限制詞,該限制詞一直有效,直到下一個限制詞開始為止.如果未加說明,類中成員默認的訪問權限是private,即私有的.類的定義類的定義成員函數:用于對數據成員進行操作返回類型類名::成員函數名(參數列表){
函數體}voidPoint::Setxy(inta,intb){ x=a; y=b;}注意:“::”表示該成員函數屬于這個特定的類類的定義數據成員的賦值 數據成員是用于描述對象的屬性,只有產生了具體的對象才有意義,可以在實例化對象的同時,通過構造函數對數據成員進行初始化,也可以通過對象進行賦值.2.對象定義了一個類后,不能對類的成員進行操作,要使用類必須先聲明類的對象,即對該類進行實例化.類的對象是具有該類類型的某一實例. 如果將類看作是自定義的類型,那么類的對象可看成是該類型的變量.對象類和對象的關系 類是對象的抽象,而對象是類的具體實例.
類是抽象的,不占用內存,而對象是具體的,占用內存的.
對象對象的定義格式:
<類名><對象名>;例如:
PointA; Point*p=&A; Point&R=b;對象對象成員的表示方法1、一般對象數據成員:
<對象名>.<成員名>成員函數:
<對象名>.<成員名>(<參數表>)A.x=20;//只有被修飾為public的成員才可這樣訪問A.Setxy(12,25);2、引用對象與此相同對象3、指針對象數據成員:
<對象名>-><成員名>成員函數:
<對象名>-><成員名>(<參數表>)p->x=20;//只有被修飾為public的成員才可這樣訪問
//等價于*p.x=20;p->Setxy(12,25); //等價于*p.Setxy(12,25);3.構造函數構造函數是類中一種特殊的成員函數,主要用來在創(chuàng)建對象時為對象申請存儲空間,并為數據成員進行初始化的操作.構造函數的名字與它所屬的類名相同,跟其他成員函數一樣,構造函數可以在類的內部定義,也可以在類的外部定義.定義構造函數時,利用參數傳遞來實現(xiàn)對被創(chuàng)建對象中的數據成員賦值,由于構造函數是在創(chuàng)建對象時執(zhí)行的,所以對數據成員的賦值一般都是初始值.當然,構造函數也可以不帶參數.構造函數構造函數的特殊性語法上,構造函數名與類名必須相同,且不能有返回類型(也意味著無返回值),除此之外與普通方法相同,如可以有參數列表、可以重載和設置參數的缺省值等.構造函數在生成對象時由系統(tǒng)自動調用.構造函數必須是公有的,否則系統(tǒng)也無法在構造對象時調用它.構造函數缺省的構造函數
在C++中,每個類必須有構造函數,否則不能生成類的對象.
如果用戶沒有定義,則系統(tǒng)自動生成一個構造函數,稱為缺省構造函數.
缺省構造函數沒有任何參數,形式為:類名();
需要特別注意的是,只要用戶自己定義了一個構造函數,無論有無參數,系統(tǒng)將不再提供缺省構造函數.構造函數構造函數原型聲明 類名(形參列表);
Point(); Point(int,int);構造函數聲明時定義類名::類名(形參列表);Point::Point():x(0),y(0);Point::Point(inta,intb):x(a),y(b);//等同于如下定義Point::Point(inta,intb){x=a;y=b;}創(chuàng)建對象時調用構造函數
PointA; PointB(10,20); x,y的值分別是?#include<iostream>#include<string>usingnamespacestd;classpoint{private: intx,y;public:point();point(int,int);voiddisplay(){cout<<x<<y;}};point::point():x(0),y(0){cout<<"abc"<<endl;}point::point(inta,intb):x(a),y(b){cout<<a<<b<<endl;}voidmain(){pointa;a.display();}構造函數構造函數與new運算符
new用于創(chuàng)建動態(tài)的對象,返回該對象的指針,可與構造函數一起使用
Point*p=newPoint;//調用無參構造函數
Point*p=newPoint(20,30);//調用有參構造函數構造函數構造函數的默認參數 若既要定義有參的構造函數,同時又要定義無參的構造函數,可只定義一個帶有默認參數的構造函數即可. 函數原型,指定默認值
Point(int=0,int=0);
函數定義
Point::Point(inta,intb):x(a),y(b);創(chuàng)建對象時調用構造函數
PointA; PointB(10,20); x,y的值分別是?構造函數復制構造函數又叫拷貝構造函數是一種特殊的構造函數,其名稱與類名稱相同.用類定義對象中,可用拷貝功能的構造函數將另一個已經存在對象的數據拷貝到新建的對象中.用一個已知的對象來初始化一個被創(chuàng)建的同類對象拷貝構造函數的特征:拷貝構造函數除了具有一般構造函數的特征外,其形參必須是本類的對象的引用.只有一個參數,是對某個對象的引用構造函數如果用戶沒有聲明類的拷貝構造函數,系統(tǒng)會自動生成一個缺省的拷貝構造函數,這個缺省的拷貝構造函數的功能是把初始化對象的每個數據成員的值都復制到新建的對象中,也可以說是同類對象的克隆.拷貝構造函數的格式 類名::類名(類名&對象名) {
函數體;
} Location::Location(Location&t){ x=t.x; y=t.y; }構造函數拷貝構造函數被調用的三種情況. ①用類的對象去初始化類的另一個對象的時候.
voidmain(void){ LocationA(1,2);
LocationB(A);
cout<<B.GetX()<<endl;
}
構造函數 ②如果函數的形參是類的對象,調用該函數進行形參和實參結合的時候.
voidfun(LocationP){ cout<<p.GetX()<<endl;
} voidmain(){ LocationA(1,2);
fun(A);
}構造函數 ③函數的返值是類的對象,函數調用完成返回的時候.
Locationfun(){ LocationA(1,2);
returnA;
} voidmain(){ LocationB;
B=fun();
}4.析構函數析構函數與構造函數的作用幾乎正好相反,它用來釋放對象,完成對象被刪除前的一些清理工作.析構函數也是類的一個公有函數成員.和構造函數一樣,析構函數必須與該類同名稱,它的名稱由類名前面加“~”構成,析構函數的其他性質如同構造函數,不能有返回值,不允許聲明返回值類型.特別不同于構造函數的是析構函數不能有任何參數,且一個類只允許有惟一的一個析構函數,也就是不能重載.
析構函數析構函數的格式:
~類名();
classPoint
{...
public:
Point(...);
//構造函數聲明
~Point();
//析構函數聲明
...
};析構函數析構函數在對象存在的函數體結束時或使用delete運算符釋放new運算創(chuàng)建的對象時被自動調用與默認的構造函數一樣,若在類的定義中沒有顯式地定義析構函數,則編譯器自動地產生一個默認的析構函數,其格式為:
<類名>::~<類名>(){} Point::~Point(){}練習假定有類AB,有相應的構造函數的定義,能正確的執(zhí)行“ABa(4),b(5),c[3],*p[2]={&a,&b};”,請問執(zhí)行完此語句后共調用該類析構函數的次數為(
)A.14B.5C.3D.1注意事項1)先建后析構2)New:先分配內存,再初始化Delete:先析構,再釋放內存this指針用類定義一個對象時,由系統(tǒng)自動建立指向該對象的指針稱為this指針.this指針的默認定義格式:<類名>*constthis=&對象;5.this指針this指針的特性(1)this是每個成員函數的一個隱含參數,通過該參數,成員函數可以獲知當前對象的地址,從而可以操縱對象所擁有的數據成員.(2)由于this指針是作為隱含參數傳遞給成員函數的,所以通常成員函數是以隱含方式使用該指針來訪問本類的數據成員的.(3)this指針具有變量和常量的雙重特征,當一個對象調用本類的成員函數時,this指針作為常量實參被傳遞,在函數體內固定指向該對象——常量特征;如果另一對象再調用成員函數時,該this指針必須重新定向——變量特征.(4)在某些場合需要顯式地使用this指針來操作調用成員函數的對象this指針關于this指針this是成員函數中,指向調用該函數的對象自身(即成員函數所屬的類對象的首地址)的隱含指針,形式如下:
classX{…… f(…)
}; Xa; a.f(…);此調用將被編譯譯轉換成 X::f(&a,……);訪問this指針
X::f(……) {
this->member }this指針的實現(xiàn)一個point類.classpoint{private: intx,y;public: point(inta,intb=10) {x=a;y=b; } intgetx() { returnx; } intgety() { returny; } voidmove(inta,intb) { x=a;y=b; }};Main(){pointp1,p2;p1.move(10,20}p2.move(3,4);}1、編譯器改變類成員的定義,用額外的this指針重新定義每個類成員函數inlinepoint(point*this,inta,intb){}inlinegetx(point*this){returnthis->x;}inlinegety(point*this){returnthis->y;}inlinevoidmove(point*this,inta,intb){this->x=a;this->y=b;}inlinevoidmove(&p1,10,20)inlinevoidmove(&p2,3,4)2、編譯器改變每個類成員函數的調用,加上一個額外的實參,即被調用對象的地址使用this指針區(qū)分二義性classX{ inti; f(inti) { this->i=i; }}使用this指針返回調用對象classX{ X&f(){……return*this;};X&g(){……return*this;};};……Xa;a.f().g();……this指針this指針的兩種常見應用this指針關于this①盡管this是一個隱式指針,但在類的成員函數中可以顯式地使用它.②在類X的非const成員函數里,this的類型就是X*.然而this并不是一個常規(guī)變量,不能給它賦值,但可以通過它修改數據成員的值.在類的const成員函數里,this被設置成constX*類型,不能通過它修改對象的數據成員值.③靜態(tài)成員函數沒有this指針,因此在靜態(tài)成員函數中不能訪問對象的非靜態(tài)數據成員6.類和對象的性質類的性質
1.類本身的成員函數可以使用類的所有成員
2.只能通過類的對象訪問公有成員函數,不能訪問私有數據成員
3.類必須在其成員使用之前聲明,可作為一個整體來使用
4.可以定義空類
5.聲明類時使用花括號確定其作用域類和對象的性質對象的性質
1.同一類的對象之間可互相賦值
PointA,B(10,20); B=A; 2.可使用對象數組
PointA[5];類和對象的性質 3.對象可以用作函數參數
voidTest(Pointt){……} 4.可使用指向對象的指針,將對象的地址置于該指針中
Point*p=&A; p->Display(); 5.一個對象可用作另一個類的成員7.UML圖形標識UML(UnifiedModelingLanguage統(tǒng)一建模語言)是一個復雜龐大的面向對象的系統(tǒng)建模語言.不是編程語言UML語言中用符號描述概念,概念間關系描述為連接符號的線.UML內容:各種類型的圖形,分別描述軟件模型的靜態(tài)結構、動態(tài)行為、模塊組織和管理如:
1)類:包括成員數據和成員函數(或方法)
2)對象:類的實例
3)類的繼承或包含
4)類及對象之間的關系,相互作用與消息傳遞等UML圖形標識類圖:由類和與之相關的各種靜態(tài)關系共同組成的圖形對象圖:一個包含了對象而沒有包含類的類圖.靜態(tài)對象圖:特定對象圖的一個實例.UML圖形標識類圖使用上下分為三段的矩形表示,上部為類名,中部為數據成員(數據,UML中稱屬性),下部為該類的函數成員(行為,UML中稱操作).Pointx:intY:int+Point(xx:int=0,yy:int=0)+Point(p:Point&)+GetX():int+GetY():int訪問控制屬性:+、-、#分別為公有、私有、保護UML的構成事物構造塊事物構造塊是對模型中最具有代表性的成分的抽象,表示系統(tǒng)中的元素結構事物:UML中的名詞,它是模型的靜態(tài)部分,描述概念或物理元素.行為事物:UML中的動詞,它是模型中的動態(tài)部分,是一種跨越時間、空間的行為.分組事物:UML中的容器,用來組織模型,使模型更加的結構化.注釋事務:UML中的解釋部分,和代碼中的注釋語句一樣,是用來描述模型的.結構事物類(class)和對象(object)接口(interface)構件(component)類和對象類是對一組具有相同屬性、相同操作、相同關系和相同語義的對象的共同特征的抽象.UML中類是用一個矩形方框表示的,它包含三個區(qū)域,最上面是類名、中間是類的屬性、最下面是類的方法對象則是類的一個實例對象名類名冒號圖形位置顏色Draw()圖形A:圖形
接口——接口是描述某個類或構件的一個服務操作集.——接口描述了一個元素的外部可見行為.
UML符號接口構件構件也稱組件,是指系統(tǒng)設計中的一個相對獨立的軟件部件.構件是系統(tǒng)設計的一個模塊化部分,它把功能實現(xiàn)部分隱藏在內部,對外提供了一組外部接口.因此,兩個具有相同接口的構件可以相互替換.
構件名稱UML1.0習慣用法UML2.0習慣用法
構件名稱行為事物交互(interaction): 是在特定語境中,共同完成某個任務的一組對象之間交換的信息集合.交互的表示法很簡單,就是一條有向直線,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學年度江蘇省蘇州市高一第二學期期中考試歷史試題(含答案)
- 2025至2030家畜飼料行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 快消品包裝產業(yè)2025年可持續(xù)發(fā)展競爭力提升與市場拓展策略報告001
- 海洋生態(tài)系統(tǒng)恢復策略與政策創(chuàng)新研究2025報告
- 2025年音樂版權市場分析:流媒體平臺運營模式與付費策略報告
- 2025年家庭教育指導服務市場家庭教育行業(yè)市場動態(tài)研究報告
- 2025年模具制造數字化設計與仿真技術高效應用策略分析報告
- 2025年智能投顧平臺風險管理與合規(guī)性優(yōu)化研究報告
- 外套采購合同
- 重慶商務職業(yè)學院《馬克思主義》2023-2024學年第一學期期末試卷
- IT云圖2025:中國算力區(qū)域競爭力研究
- 四川省成都市成華區(qū)2023-2024學年高一下學期期末考試數學試題(解析版)
- 環(huán)衛(wèi)設備部技能提升與安全管理培訓會
- 規(guī)范辦學專題宣講
- 某地500kW-2MWh用戶側儲能系統(tǒng)技術方案(削峰填谷儲能項目)
- 小學電路知識課件
- 小猴子下山第一課時教學設計
- 散文閱讀:2025屆高考語文一輪復習大綱
- 國家開放大學行管專科《行政組織學》期末紙質考試總題庫(2025春期版)
- 2025年江蘇南京市河西新城區(qū)國有資產經營控股集團招聘筆試參考題庫附帶答案詳解
- 《旅游公路設計指南》
評論
0/150
提交評論