三、類的成員函式
四、類的物件大小的計算
五、類成員函式this指標
六、物件
首先我們舉乙個很常見的例子:鐘錶,時鐘類的定義如下:
class
clock
;
這裡,封裝了時鐘的資料和行為,分別稱為clock類的資料成員和函式成員,定義類的語法形式如下:
class 類名稱
;
其中public, protected,private分別表示對成員的不同訪問許可權。
notes:在類中可以宣告函式的原型,函式的實現可以在外部。
類的成員包括資料成員以及函式成員,分別描述問題的屬性以及行為。
對類成員訪問許可權的控制,是通過設定成員的訪問控制屬性而實現的,訪問屬性有一下3種:
公有型別(public)、私有型別(private)和保護型別(protected)。
公有型別成員定義了類的外部介面。公有成員用public關鍵字宣告,在類的作用域外只能訪問類的共有成員。對於時鐘的例子,外部只能呼叫settime()和showtime()這兩種公有型別。
在關鍵字private後面宣告的就是類的私有成員。如果私有成員緊接著類名稱,則關鍵字private可以被省略。私有成員只能被本類的成員函式訪問,來自類外部的任何訪問都是非法的。對於時鐘的例子,hour、minute和second都是私有成員。
保護型別成員的性質和私有成員的性質相似,其差別在於繼承過程中對產生的新類影響不同(本篇文章不做**)
notes:一般情況下,乙個類的資料成員都應該宣告為私有成員,這樣,內部資料結構就不會對該類以外的其餘部分造成影響。
notes:在類的定義中,修飾訪問屬性的關鍵字可以出現多次。但是乙個成員只能具有一種訪問屬性。例如:
class
clock
;
類的成員函式描述的是類行為,例如時鐘的settime()和showtime()。成員函式是程式演算法的實現部分,是對封裝的資料進行操作的方法。
函式的原型宣告要寫在類體中,原型說明了函式的參數列和返回型別。而函式的具體實現是可以寫在類定義之外的。與普通函式不同的是,實現成員函式時要指明類的名稱,具體形式為:
返回值型別 類名::函式成員名(參數列)
類的成員函式也可以有預設形參值,其呼叫規則與普通函式相同,類成員函式的預設值,一定要寫在類定義中,而不能寫在類定義之外的函式實現中,例如:
class
clock
;
這樣,如果呼叫函式時沒有給出實參,就會按照預設按照預設形參值將時鐘設定到了0點。
乙個類的大小,實際就是該類中"成員變數"之和,當然也要記憶體對齊,例如:
#include
using
namespace std;
class
a1private
:int a,b;};
classa2}
;classa3;
intmain()
a1 = 8,a2 = 1,a3 = 1;
notes:空模擬較特殊,編譯器給了空類乙個位元組來唯一標識這個類。
我們先看一段**:
using
namespace std;
class
clock
void
showtime()
private
:int hour,minute,second;};
intmain()
那麼思考這樣乙個問題:clock類中有settime()和showtime()兩個函式,函式體中沒有關於不同物件的區分,那麼為何當myclock_1呼叫settime()函式時,函式是怎麼知道應該設定myclock_1物件,而不是myclock_2物件呢?
c++中通過引入this指標解決上上述問題:c++編譯器給每個「非靜態的成員函式」增加了乙個隱藏的指標引數,讓該指標指向當前物件,在函式體中所有成員變數的操作都是通過this指標去訪問,使用者不需要去傳遞,編譯器自動完成。
notes:
class
a1private
:int b;
};
上述3種表示方式是等價的。
notes:this指標只能在類的成員函式中呼叫,第乙個成員函式的預設引數為:*t const register this , 如: class a}; 其中,func的原型在編譯器看來應該是: int func(a const register this, int p);*它表示當前函式的位址。this指標一般放在成員函式的第乙個引數列表中。
1.this指標存在**?
答:編譯器在生成程式時加入了獲取物件首位址的相關**。並把獲取的首位址存放在了暫存器ecx中(vc++編譯器是放在ecx中,其它編譯器有可能不同)。也就是成員函式的其它引數正常都是存放在棧中。而this指標引數則是存放在暫存器中。
2.this指標可以為空嗎?
答: 可以為空,當呼叫函式時,如果函式內部不需要使用到this,也就是不需要通過this指向當前物件並對其進行操作時才可以為空。
3.this指標是什麼時候建立的?
答:this在成員函式的開始執行前構造的,在成員的執行結束後清除。
4.this指標如何訪問類中變數的? 如果不是類,而是結構的話,那麼,如何通過結構指標來訪問結構中的變數呢?
答:在c++中,類和結構的區別是:類的成員預設是private,而結構是public。 this是類的指標,如果換成結構,那this就是結構的指標了。
如果將類看作是乙個自定義的型別,那麼類的物件就可以看作
是該型別的變數。宣告乙個物件和宣告乙個一般變數相同,採用以下的方式:
類名 物件名;
例如:clock myclock;
就宣告了乙個時鐘型別的物件myclock。
定義了類及其物件,就可以訪問物件的成員,這種訪問方式採用的是「 . 」操作符,訪問資料的一般形式為:
物件名.資料成員名
呼叫函式成員的一般形式為:
物件名.函式成員名(參數列)
例如,訪問類clock的物件myclock的函式成員showtime()的方式如下:
myclock.
showtime
()
在類的外部只能訪問到類的公有成員,在類的成員函式中,可以訪問到類的全部成員。 C 類與物件
程式設計模型 所有計算機均由兩種元素組成 和資料.精確的說,有些程式是圍繞著 什麼正在發生 而編寫,有些則是圍繞 誰正在受影響 而編寫的.抽象封裝 封裝是一種把 和 所操作的資料 在一起,使這兩者不受外界干擾和誤用的機制.繼承 繼承是指乙個物件從另乙個物件中獲得屬性的過程.是物件導向程式設計的三大原...
C 類與物件
c 類與物件 區分物件導向與面向過程 物件導向是指一種程式設計范型,同時也是一種程式開發的方法。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。物件導向 利用物件間的訊息傳遞來驅動程式的執行。優點 真實表現客觀世界,物件間的關係清晰,物件間的訊息處理高效。面...
C 類與物件
類是物件導向的核心機制,是物件導向設計中對具有相同或相似性質的物件的抽象,是對資料和操作進行封裝的載體,進而保證了對資料的安全 高效 合理的訪問 物件是類的例項,是類的具體個體,對應現實世界的實體。類的定義 class 類名 void showclock 習慣上在類的宣告中只定義函式的原型,在類外定...