天天看點

《C++面向對象高效程式設計(第2版)》——1.4 了解消息、方法和執行個體變量

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第1章,第1.4節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

類的任何使用者(通常是另一個程式,甚至是另一個類)都是類的客戶。客戶通過類的對象使用成員函數(消息)進行有用的操作。在後面的章節中我們将介紹,客戶隻能建立類的對象和使用這些已建立的對象,或者客戶也可以根據現有類通過繼承建立新的類。

smalltalk  在smalltalk中,調用對象的接口函數(成員函數)被視為向對象發送消息。我們向bankaccount類對象發送makedeposit消息,要求它接收存款。向對象發送消息将引起該對象中的方法被執行(即當我們發送消息時,對象會執行特定的方法或函數)。也就是說,對象響應了消息。消息隻是客戶所見的一個名稱,而且該名稱可能在運作期被綁定在正确的實作(方法)上,該實作在接收消息的對象内。類的每個執行個體(即每個對象)都包含執行個體變量的單獨副本,如圖1-2所示。

表1-1 不同語言中使用的術語

《C++面向對象高效程式設計(第2版)》——1.4 了解消息、方法和執行個體變量

注意:

術語方法(消息)、操作和成員函數在本書中将互換使用,實質上它們的含義相同。

1.4.1 對象中包含的内容

每一個被建立(或者執行個體化)的對象都獲得自身資料成員的副本,資料成員(靜态資料成員除外)都是不共享的。稍後我們會介紹,在c++的運作程式中,隻有靜态資料成員可以在類的對象之間共享。smalltalk也支援共享資料成員1。什麼是成員函數?是否每個對象也能得到每個成員函數代碼的副本?很顯然不是這樣。每個對象都能對聲明在類中的所有成員函數作出響應,但是對象本身并不包含成員函數實作代碼的副本。至少在運作程式(程序或者任務)中,隻存在成員函數實作代碼的一份副本。無論在程序中建立了多少個類對象,成員函數的代碼均不會被複制,這些代碼在類的所有對象之間共享。為了便于了解,可以想象類的實作代碼駐留在一個庫中。許多實作都可以進一步優化,它們隻會為整個系統保留唯一一份實作代碼的副本,這通常使用動态共享庫完成。這些細節都由作業系統具體規定。例如,我們可以用card類來表示紙牌遊戲中的一張牌,如下所示:

card  spade_ace(ace, spade);  // 黑桃a

card  clubs_2(two, clubs);  // 梅花2

card  diamond_jack(jack, diamond); // 方塊j<code>`</code>

《C++面向對象高效程式設計(第2版)》——1.4 了解消息、方法和執行個體變量

圖1-3

一旦設計并實作了一個類,程式員在需要使用該類的對象時,即可通過代碼執行個體化它們。各種語言執行個體化對象的方式不同。在c++中,對象的執行個體化看起來是一個簡單的聲明,如下所示:

<code>bankaccount myaccount;</code>

在smalltalk中,為初始化類的新對象,程式員必須給該類發送預定義的消息new,如下所示:

<code>bankaccount new.</code>

在eiffel中,必須用預定義的操作make來建立一個新對象。

繼續閱讀