版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第四章類和對象C++本章主要內(nèi)容類及其實例化構(gòu)造函數(shù)析構(gòu)函數(shù)this指針類和對象的性質(zhì)面向?qū)ο蟮臉擞泩D
類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的運算封裝在一起,使類中的數(shù)據(jù)得到很好的“保護”.
類是具有相同屬性和行為的一組對象的集合,為屬于該類的全部對象提供了統(tǒng)一的抽象描述.1.類的定義
類的定義格式:class類名{private:
成員數(shù)據(jù);
成員函數(shù);
public:
成員數(shù)據(jù);
成員函數(shù);
protected:
成員數(shù)據(jù);
成員函數(shù);};關(guān)鍵字類名私有公有保護classStudent{private:intnum;charname[20];charsex; public:voidStudent::display(){ cout<<“num:”<<num<<endl; cout<<“name:”<<name<<endl; cout<<“sex:”<<sex
<<endl;}};分號不能少類的定義private限定用關(guān)鍵字private限定的成員稱為私有成員,對私有成員限定在該類的內(nèi)部使用,即只允許該類中的成員函數(shù)使用私有的成員數(shù)據(jù),對于私有的成員函數(shù),只能被該類內(nèi)的成員函數(shù)調(diào)用;類就相當于私有成員的作用域.
類的定義public限定用關(guān)鍵字public限定的成員稱為公有成員,公有成員的數(shù)據(jù)或函數(shù)不受類的限制,可以在類內(nèi)或類外自由使用;對類而言是透明的.類的定義protected限定用關(guān)鍵字protected所限定的成員稱為保護成員,只允許在類內(nèi)及該類的派生類中使用保護的數(shù)據(jù)或函數(shù).即保護成員的作用域是該類及該類的派生類.類的定義私有成員公有成員保護成員類內(nèi)函數(shù)可以調(diào)用可以調(diào)用可以調(diào)用類外函數(shù)不可調(diào)用可以調(diào)用不可調(diào)用私有函數(shù)公有函數(shù)保護函數(shù)類內(nèi)函數(shù)可以調(diào)用可以調(diào)用可以調(diào)用類外函數(shù)不可調(diào)用可以調(diào)用不可調(diào)用類的定義每一個限制詞(private等)在類體中可使用多次.一旦使用了限制詞,該限制詞一直有效,直到下一個限制詞開始為止.如果未加說明,類中成員默認的訪問權(quán)限是private,即私有的.類的定義類的定義成員函數(shù):用于對數(shù)據(jù)成員進行操作返回類型類名::成員函數(shù)名(參數(shù)列表){
函數(shù)體}voidPoint::Setxy(inta,intb){ x=a; y=b;}注意:“::”表示該成員函數(shù)屬于這個特定的類類的定義數(shù)據(jù)成員的賦值 數(shù)據(jù)成員是用于描述對象的屬性,只有產(chǎn)生了具體的對象才有意義,可以在實例化對象的同時,通過構(gòu)造函數(shù)對數(shù)據(jù)成員進行初始化,也可以通過對象進行賦值.2.對象定義了一個類后,不能對類的成員進行操作,要使用類必須先聲明類的對象,即對該類進行實例化.類的對象是具有該類類型的某一實例. 如果將類看作是自定義的類型,那么類的對象可看成是該類型的變量.對象類和對象的關(guān)系 類是對象的抽象,而對象是類的具體實例.
類是抽象的,不占用內(nèi)存,而對象是具體的,占用內(nèi)存的.
對象對象的定義格式:
<類名><對象名>;例如:
PointA; Point*p=&A; Point&R=b;對象對象成員的表示方法1、一般對象數(shù)據(jù)成員:
<對象名>.<成員名>成員函數(shù):
<對象名>.<成員名>(<參數(shù)表>)A.x=20;//只有被修飾為public的成員才可這樣訪問A.Setxy(12,25);2、引用對象與此相同對象3、指針對象數(shù)據(jù)成員:
<對象名>-><成員名>成員函數(shù):
<對象名>-><成員名>(<參數(shù)表>)p->x=20;//只有被修飾為public的成員才可這樣訪問
//等價于*p.x=20;p->Setxy(12,25); //等價于*p.Setxy(12,25);3.構(gòu)造函數(shù)構(gòu)造函數(shù)是類中一種特殊的成員函數(shù),主要用來在創(chuàng)建對象時為對象申請存儲空間,并為數(shù)據(jù)成員進行初始化的操作.構(gòu)造函數(shù)的名字與它所屬的類名相同,跟其他成員函數(shù)一樣,構(gòu)造函數(shù)可以在類的內(nèi)部定義,也可以在類的外部定義.定義構(gòu)造函數(shù)時,利用參數(shù)傳遞來實現(xiàn)對被創(chuàng)建對象中的數(shù)據(jù)成員賦值,由于構(gòu)造函數(shù)是在創(chuàng)建對象時執(zhí)行的,所以對數(shù)據(jù)成員的賦值一般都是初始值.當然,構(gòu)造函數(shù)也可以不帶參數(shù).構(gòu)造函數(shù)構(gòu)造函數(shù)的特殊性語法上,構(gòu)造函數(shù)名與類名必須相同,且不能有返回類型(也意味著無返回值),除此之外與普通方法相同,如可以有參數(shù)列表、可以重載和設(shè)置參數(shù)的缺省值等.構(gòu)造函數(shù)在生成對象時由系統(tǒng)自動調(diào)用.構(gòu)造函數(shù)必須是公有的,否則系統(tǒng)也無法在構(gòu)造對象時調(diào)用它.構(gòu)造函數(shù)缺省的構(gòu)造函數(shù)
在C++中,每個類必須有構(gòu)造函數(shù),否則不能生成類的對象.
如果用戶沒有定義,則系統(tǒng)自動生成一個構(gòu)造函數(shù),稱為缺省構(gòu)造函數(shù).
缺省構(gòu)造函數(shù)沒有任何參數(shù),形式為:類名();
需要特別注意的是,只要用戶自己定義了一個構(gòu)造函數(shù),無論有無參數(shù),系統(tǒng)將不再提供缺省構(gòu)造函數(shù).構(gòu)造函數(shù)構(gòu)造函數(shù)原型聲明 類名(形參列表);
Point(); Point(int,int);構(gòu)造函數(shù)聲明時定義類名::類名(形參列表);Point::Point():x(0),y(0);Point::Point(inta,intb):x(a),y(b);//等同于如下定義Point::Point(inta,intb){x=a;y=b;}創(chuàng)建對象時調(diào)用構(gòu)造函數(shù)
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();}構(gòu)造函數(shù)構(gòu)造函數(shù)與new運算符
new用于創(chuàng)建動態(tài)的對象,返回該對象的指針,可與構(gòu)造函數(shù)一起使用
Point*p=newPoint;//調(diào)用無參構(gòu)造函數(shù)
Point*p=newPoint(20,30);//調(diào)用有參構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)的默認參數(shù) 若既要定義有參的構(gòu)造函數(shù),同時又要定義無參的構(gòu)造函數(shù),可只定義一個帶有默認參數(shù)的構(gòu)造函數(shù)即可. 函數(shù)原型,指定默認值
Point(int=0,int=0);
函數(shù)定義
Point::Point(inta,intb):x(a),y(b);創(chuàng)建對象時調(diào)用構(gòu)造函數(shù)
PointA; PointB(10,20); x,y的值分別是?構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)又叫拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其名稱與類名稱相同.用類定義對象中,可用拷貝功能的構(gòu)造函數(shù)將另一個已經(jīng)存在對象的數(shù)據(jù)拷貝到新建的對象中.用一個已知的對象來初始化一個被創(chuàng)建的同類對象拷貝構(gòu)造函數(shù)的特征:拷貝構(gòu)造函數(shù)除了具有一般構(gòu)造函數(shù)的特征外,其形參必須是本類的對象的引用.只有一個參數(shù),是對某個對象的引用構(gòu)造函數(shù)如果用戶沒有聲明類的拷貝構(gòu)造函數(shù),系統(tǒng)會自動生成一個缺省的拷貝構(gòu)造函數(shù),這個缺省的拷貝構(gòu)造函數(shù)的功能是把初始化對象的每個數(shù)據(jù)成員的值都復(fù)制到新建的對象中,也可以說是同類對象的克隆.拷貝構(gòu)造函數(shù)的格式 類名::類名(類名&對象名) {
函數(shù)體;
} Location::Location(Location&t){ x=t.x; y=t.y; }構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)被調(diào)用的三種情況. ①用類的對象去初始化類的另一個對象的時候.
voidmain(void){ LocationA(1,2);
LocationB(A);
cout<<B.GetX()<<endl;
}
構(gòu)造函數(shù) ②如果函數(shù)的形參是類的對象,調(diào)用該函數(shù)進行形參和實參結(jié)合的時候.
voidfun(LocationP){ cout<<p.GetX()<<endl;
} voidmain(){ LocationA(1,2);
fun(A);
}構(gòu)造函數(shù) ③函數(shù)的返值是類的對象,函數(shù)調(diào)用完成返回的時候.
Locationfun(){ LocationA(1,2);
returnA;
} voidmain(){ LocationB;
B=fun();
}4.析構(gòu)函數(shù)析構(gòu)函數(shù)與構(gòu)造函數(shù)的作用幾乎正好相反,它用來釋放對象,完成對象被刪除前的一些清理工作.析構(gòu)函數(shù)也是類的一個公有函數(shù)成員.和構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)必須與該類同名稱,它的名稱由類名前面加“~”構(gòu)成,析構(gòu)函數(shù)的其他性質(zhì)如同構(gòu)造函數(shù),不能有返回值,不允許聲明返回值類型.特別不同于構(gòu)造函數(shù)的是析構(gòu)函數(shù)不能有任何參數(shù),且一個類只允許有惟一的一個析構(gòu)函數(shù),也就是不能重載.
析構(gòu)函數(shù)析構(gòu)函數(shù)的格式:
~類名();
classPoint
{...
public:
Point(...);
//構(gòu)造函數(shù)聲明
~Point();
//析構(gòu)函數(shù)聲明
...
};析構(gòu)函數(shù)析構(gòu)函數(shù)在對象存在的函數(shù)體結(jié)束時或使用delete運算符釋放new運算創(chuàng)建的對象時被自動調(diào)用與默認的構(gòu)造函數(shù)一樣,若在類的定義中沒有顯式地定義析構(gòu)函數(shù),則編譯器自動地產(chǎn)生一個默認的析構(gòu)函數(shù),其格式為:
<類名>::~<類名>(){} Point::~Point(){}練習假定有類AB,有相應(yīng)的構(gòu)造函數(shù)的定義,能正確的執(zhí)行“ABa(4),b(5),c[3],*p[2]={&a,&b};”,請問執(zhí)行完此語句后共調(diào)用該類析構(gòu)函數(shù)的次數(shù)為(
)A.14B.5C.3D.1注意事項1)先建后析構(gòu)2)New:先分配內(nèi)存,再初始化Delete:先析構(gòu),再釋放內(nèi)存this指針用類定義一個對象時,由系統(tǒng)自動建立指向該對象的指針稱為this指針.this指針的默認定義格式:<類名>*constthis=&對象;5.this指針this指針的特性(1)this是每個成員函數(shù)的一個隱含參數(shù),通過該參數(shù),成員函數(shù)可以獲知當前對象的地址,從而可以操縱對象所擁有的數(shù)據(jù)成員.(2)由于this指針是作為隱含參數(shù)傳遞給成員函數(shù)的,所以通常成員函數(shù)是以隱含方式使用該指針來訪問本類的數(shù)據(jù)成員的.(3)this指針具有變量和常量的雙重特征,當一個對象調(diào)用本類的成員函數(shù)時,this指針作為常量實參被傳遞,在函數(shù)體內(nèi)固定指向該對象——常量特征;如果另一對象再調(diào)用成員函數(shù)時,該this指針必須重新定向——變量特征.(4)在某些場合需要顯式地使用this指針來操作調(diào)用成員函數(shù)的對象this指針關(guān)于this指針this是成員函數(shù)中,指向調(diào)用該函數(shù)的對象自身(即成員函數(shù)所屬的類對象的首地址)的隱含指針,形式如下:
classX{…… f(…)
}; Xa; a.f(…);此調(diào)用將被編譯譯轉(zhuǎn)換成 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指針重新定義每個類成員函數(shù)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、編譯器改變每個類成員函數(shù)的調(diào)用,加上一個額外的實參,即被調(diào)用對象的地址使用this指針區(qū)分二義性classX{ inti; f(inti) { this->i=i; }}使用this指針返回調(diào)用對象classX{ X&f(){……return*this;};X&g(){……return*this;};};……Xa;a.f().g();……this指針this指針的兩種常見應(yīng)用this指針關(guān)于this①盡管this是一個隱式指針,但在類的成員函數(shù)中可以顯式地使用它.②在類X的非const成員函數(shù)里,this的類型就是X*.然而this并不是一個常規(guī)變量,不能給它賦值,但可以通過它修改數(shù)據(jù)成員的值.在類的const成員函數(shù)里,this被設(shè)置成constX*類型,不能通過它修改對象的數(shù)據(jù)成員值.③靜態(tài)成員函數(shù)沒有this指針,因此在靜態(tài)成員函數(shù)中不能訪問對象的非靜態(tài)數(shù)據(jù)成員6.類和對象的性質(zhì)類的性質(zhì)
1.類本身的成員函數(shù)可以使用類的所有成員
2.只能通過類的對象訪問公有成員函數(shù),不能訪問私有數(shù)據(jù)成員
3.類必須在其成員使用之前聲明,可作為一個整體來使用
4.可以定義空類
5.聲明類時使用花括號確定其作用域類和對象的性質(zhì)對象的性質(zhì)
1.同一類的對象之間可互相賦值
PointA,B(10,20); B=A; 2.可使用對象數(shù)組
PointA[5];類和對象的性質(zhì) 3.對象可以用作函數(shù)參數(shù)
voidTest(Pointt){……} 4.可使用指向?qū)ο蟮闹羔?將對象的地址置于該指針中
Point*p=&A; p->Display(); 5.一個對象可用作另一個類的成員7.UML圖形標識UML(UnifiedModelingLanguage統(tǒng)一建模語言)是一個復(fù)雜龐大的面向?qū)ο蟮南到y(tǒng)建模語言.不是編程語言UML語言中用符號描述概念,概念間關(guān)系描述為連接符號的線.UML內(nèi)容:各種類型的圖形,分別描述軟件模型的靜態(tài)結(jié)構(gòu)、動態(tài)行為、模塊組織和管理如:
1)類:包括成員數(shù)據(jù)和成員函數(shù)(或方法)
2)對象:類的實例
3)類的繼承或包含
4)類及對象之間的關(guān)系,相互作用與消息傳遞等UML圖形標識類圖:由類和與之相關(guān)的各種靜態(tài)關(guān)系共同組成的圖形對象圖:一個包含了對象而沒有包含類的類圖.靜態(tài)對象圖:特定對象圖的一個實例.UML圖形標識類圖使用上下分為三段的矩形表示,上部為類名,中部為數(shù)據(jù)成員(數(shù)據(jù),UML中稱屬性),下部為該類的函數(shù)成員(行為,UML中稱操作).Pointx:intY:int+Point(xx:int=0,yy:int=0)+Point(p:Point&)+GetX():int+GetY():int訪問控制屬性:+、-、#分別為公有、私有、保護UML的構(gòu)成事物構(gòu)造塊事物構(gòu)造塊是對模型中最具有代表性的成分的抽象,表示系統(tǒng)中的元素結(jié)構(gòu)事物:UML中的名詞,它是模型的靜態(tài)部分,描述概念或物理元素.行為事物:UML中的動詞,它是模型中的動態(tài)部分,是一種跨越時間、空間的行為.分組事物:UML中的容器,用來組織模型,使模型更加的結(jié)構(gòu)化.注釋事務(wù):UML中的解釋部分,和代碼中的注釋語句一樣,是用來描述模型的.結(jié)構(gòu)事物類(class)和對象(object)接口(interface)構(gòu)件(component)類和對象類是對一組具有相同屬性、相同操作、相同關(guān)系和相同語義的對象的共同特征的抽象.UML中類是用一個矩形方框表示的,它包含三個區(qū)域,最上面是類名、中間是類的屬性、最下面是類的方法對象則是類的一個實例對象名類名冒號圖形位置顏色Draw()圖形A:圖形
接口——接口是描述某個類或構(gòu)件的一個服務(wù)操作集.——接口描述了一個元素的外部可見行為.
UML符號接口構(gòu)件構(gòu)件也稱組件,是指系統(tǒng)設(shè)計中的一個相對獨立的軟件部件.構(gòu)件是系統(tǒng)設(shè)計的一個模塊化部分,它把功能實現(xiàn)部分隱藏在內(nèi)部,對外提供了一組外部接口.因此,兩個具有相同接口的構(gòu)件可以相互替換.
構(gòu)件名稱UML1.0習慣用法UML2.0習慣用法
構(gòu)件名稱行為事物交互(interaction): 是在特定語境中,共同完成某個任務(wù)的一組對象之間交換的信息集合.交互的表示法很簡單,就是一條有向直線,
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2北京2024版物業(yè)公司轉(zhuǎn)讓合同:價格、流程與標的物
- 二零二五版自然人之間文化創(chuàng)意作品授權(quán)合同2篇
- 屋頂租賃違約金合同(2篇)
- 二零二五年度液化氣站送氣工勞動合同書3篇
- 二零二五版本二手房買賣合同含房屋交易資金監(jiān)管條款3篇
- 二零二五年高端活動贊助廣告發(fā)布合同模板3篇
- 二零二五年度離婚協(xié)議書起草與財務(wù)規(guī)劃服務(wù)合同3篇
- 2025年度汽車租賃行業(yè)擔保函制定與法律效力確認合同3篇
- 二零二五年車庫購置與車位租賃及產(chǎn)權(quán)登記服務(wù)合同樣本2篇
- 二零二五年污水處理廠污水處理能力提升合同3篇
- 2023年河南省公務(wù)員錄用考試《行測》真題及答案解析
- 2024年安徽省公務(wù)員錄用考試《行測》真題及答案解析
- 山西省太原市重點中學(xué)2025屆物理高一第一學(xué)期期末統(tǒng)考試題含解析
- 充電樁項目運營方案
- 2024年農(nóng)民職業(yè)農(nóng)業(yè)素質(zhì)技能考試題庫(附含答案)
- 高考對聯(lián)題(對聯(lián)知識、高考真題及答案、對應(yīng)練習題)
- 新版《鐵道概論》考試復(fù)習試題庫(含答案)
- 【律師承辦案件費用清單】(計時收費)模板
- 高中物理競賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- Unit1FestivalsandCelebrations詞匯清單高中英語人教版
- 2024年上海市中考語文試題卷(含答案)
評論
0/150
提交評論