C++類和對象基礎(chǔ)詳解_第1頁
C++類和對象基礎(chǔ)詳解_第2頁
C++類和對象基礎(chǔ)詳解_第3頁
C++類和對象基礎(chǔ)詳解_第4頁
C++類和對象基礎(chǔ)詳解_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第C++類和對象基礎(chǔ)詳解目錄一、類和對象的基本概念結(jié)構(gòu)化程序設(shè)計面向?qū)ο蟮某绦蛟O(shè)計使用類的成員變量和成員函數(shù)二、類和對象基礎(chǔ)類成員的可訪問范圍構(gòu)造函數(shù)(constructor)基本概念拷貝(復(fù)制)構(gòu)造函數(shù)類型轉(zhuǎn)換構(gòu)造函數(shù)析構(gòu)函數(shù)(destructors)總結(jié)

一、類和對象的基本概念

結(jié)構(gòu)化程序設(shè)計

C語言使用結(jié)構(gòu)化程序設(shè)計:

程序=數(shù)據(jù)結(jié)構(gòu)+算法

程序由全局變量以及眾多相互調(diào)用的函數(shù)組成。算法以函數(shù)的形式實現(xiàn),用于對數(shù)據(jù)結(jié)構(gòu)進行操作。

結(jié)構(gòu)化程序設(shè)計的不足

1.結(jié)構(gòu)化程序設(shè)計中,函數(shù)和其所操作的數(shù)據(jù)結(jié)構(gòu),沒有直觀的聯(lián)系。

2.隨著程序規(guī)模的增加,程序逐漸難以理解,很難一下子看出來:

某個數(shù)據(jù)結(jié)構(gòu)到底有哪些函數(shù)可以對它進行操作?

某個函數(shù)到底是用來操作哪些數(shù)據(jù)結(jié)構(gòu)的?

任何兩個函數(shù)之間存在怎樣的調(diào)用關(guān)系?

3.結(jié)構(gòu)化程序設(shè)計沒有“封裝”和“隱藏”的概念。要訪問某個數(shù)據(jù)結(jié)構(gòu)中的某個變量,就可以直接訪問,那么當該變量的定義有改動的時候,就要把所有訪問該變量的語句找出來修改,十分不利于程序的維護、擴充。

4.難以查錯,當某個數(shù)據(jù)結(jié)構(gòu)的值不正確時,難以找出到底是那個函數(shù)導(dǎo)致的。

5.重用:在編寫某個程序時,發(fā)現(xiàn)其需要的某項功能,在現(xiàn)有的某個程序里已經(jīng)有了相同或類似的實現(xiàn),那么自然希望能夠?qū)⒛遣糠执a抽取出來,在新程序中使用。

6.在結(jié)構(gòu)化程序設(shè)計中,隨著程序規(guī)模的增大,由于程序大量函數(shù)、變量之間的關(guān)系錯綜復(fù)雜,要抽取這部分代碼,會變得十分困難。

總之,結(jié)構(gòu)化的程序,在規(guī)模龐大時,會變得難以理解,難以擴充(增加新功能),難以查錯,難以重用。

如何更高效地實現(xiàn)函數(shù)的復(fù)用?

如何更清晰的實現(xiàn)變量和函數(shù)的關(guān)系?使得程序更清晰更易于修改和維護。

面向?qū)ο蟮某绦蛟O(shè)計

面向?qū)ο蟮某绦?類+類+…+類

面向?qū)ο蟮某绦蛟O(shè)計方法:

將某類客觀事物共同特點(屬性)歸納出來,形成一個數(shù)據(jù)結(jié)構(gòu)(可以用多個變量描述事物的屬性);

將這類事物所能進行的行為也歸納出來,形成一個個函數(shù),這些函數(shù)可以用來操作數(shù)據(jù)結(jié)構(gòu)(這一步叫“抽象”)。

然后,通過某種語法形式,將數(shù)據(jù)結(jié)構(gòu)和操作該數(shù)據(jù)結(jié)構(gòu)的函數(shù)“捆綁”在一起,形成一個“類”,從而使得數(shù)據(jù)結(jié)構(gòu)和操作該數(shù)據(jù)結(jié)構(gòu)的算法呈現(xiàn)出顯而易見的緊密關(guān)系,這就是“封裝”。

面向?qū)ο蟮某绦蛟O(shè)計具有“抽象”,“封裝”“繼承”“多態(tài)”四個基本特點。

例如:

將長、寬變量和設(shè)置長,寬,求面積,以及求周長的三個函數(shù)“封裝”在一起,就能形成一個“矩形類”。

長、寬變量成為該“矩形類”的“成員變量”,三個函數(shù)成為該類的“成員函數(shù)”。成員變量和成員函數(shù)統(tǒng)稱為類的成員。

classCRectangle

public:

intw,h;

intArea(){

returnw*h;

intPerimeter(){

return2*(w+h);

voidInit(intw_,inth_){

w=w_;h=h_;

};//必須有分號

通過類,可以定義變量。類定義出來的變量,也稱為類的實例,就是我們所說的“對象”。

C++中,類的名字就是用戶自定義的類型的名字??梢韵笫褂没绢愋湍菢觼硎褂盟?。CRectangle就是一種用戶自定義的類型。

intmain()

intw,h;

CRectangler;//r是一個對象

cinwh;

r.Init(w,h);

coutr.Area()endl

r.Perimeter();

return0;

對象的內(nèi)存分配

類的內(nèi)存分配與結(jié)構(gòu)體分配內(nèi)存相同,類的成員函數(shù)所占內(nèi)存不屬于類。

每個對象各有自己的存儲空間。一個對象的某個成員變量被改變了,不會影響到另一個對象。

和結(jié)構(gòu)變量一樣,對象之間可以用“=”進行賦值,但是不能用“==”,“!=”,“”,“”“=”“=”進行比較,除非這些運算符經(jīng)過了“重載”(第四篇講)。

使用類的成員變量和成員函數(shù)

用法1:對象名.成員名

CRectangler1,r2;

r1.w=5;

r2.Init(5,4);

用法2:指針-成員名

CRectangler1,r2;

CRectangle*p1=r1;

CRectangle*p2=r2;

p1-w=5;

p2-Init(5,4);//Init作用在p2指向的對象上

用法3:引用名.成員名

CRectangler2;

CRectanglerr=r2;

rr.w=5;

rr.Init(5,4);//rr的值變了,r2的值也變

二、類和對象基礎(chǔ)類成員的可訪問范圍

在類的定義中,用下列訪問范圍關(guān)鍵字來說明類成員

可被訪問的范圍:

private:私有成員,只能在成員函數(shù)內(nèi)訪問

public:公有成員,可以在任何地方訪問

protected:保護成員,后面再說,暫時理解和私有成員類似

以上三種關(guān)鍵字出現(xiàn)的次數(shù)和先后次序都沒有限制。

代碼如下(示例):

classclassName{

private:

私有屬性和函數(shù)

public:

公有屬性和函數(shù)

protected:

保護屬性和函數(shù)

如過某個成員前面沒有上述關(guān)鍵字,則缺省地被認為是私有成員。

classMan{

intnAge;//私有成員

charszName[20];//私有成員

public:

voidSetName(char*szName){

strcpy(Man::szName,szName);

在類的成員函數(shù)內(nèi)部,能夠訪問:

當前對象的全部屬性、函數(shù);

同類其它對象的全部屬性、函數(shù)。

在類的成員函數(shù)以外的地方,只能夠訪問該類對象的公有成員。

成員函數(shù)在類內(nèi)聲明,一般在類外實現(xiàn)(也可類內(nèi)聲明并實現(xiàn)),需要加上“類名::”。

classCEmployee{

private:

charszName[30];//名字

public:

intsalary;//工資

voidsetName(char*name);

voidgetName(char*name);

voidaverageSalary(CEmployeee1,CEmployeee2);

voidCEmployee::setName(char*name){

strcpy(szName,name);//ok

voidCEmployee::getName(char*name){

strcpy(name,szName);//ok

voidCEmployee::averageSalary(CEmployeee1,CEmployeee2){

coute1.szName;//ok,訪問同類其他對象私有成員

salary=(e1.salary+e2.salary)/2;

intmain()

CEmployeee;

strcpy(e.szName,"Tom1234567889");//編譯錯,不能訪問私有成員

e.setName("Tom");//ok

e.salary=5000;//ok

return0;

設(shè)置私有成員的機制,叫“隱藏”

“隱藏”的目的是強制對成員變量的訪問一定要通過成員函數(shù)進行,那么后成員變量的類型等屬性修改后,只需要更改成員函數(shù)即可。否則,所有直接訪問成員變量的語句都需要修改。

同樣我們也可以用struct定義類

structCEmployee{

charszName[30];//公有!!

public:

intsalary;//工資

voidsetName(char*name);

voidgetName(char*name);

voidaverageSalary(CEmployee

e1,CEmployeee2);

和用"class"的唯一區(qū)別,就是未說明是公有,還是私有的成員。

成員函數(shù)的重載及參數(shù)缺省

成員函數(shù)也可以重載

成員函數(shù)可以帶缺省

溫馨提示

  • 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

提交評論