C++語言編程基礎:類和數據抽象

舉例:

詳細的例子:

該例中使用了名字空間, using std::cout 的作用是將 cout 操作符從標準名字空間 std 中
提取出來。每一個類都有名字空間, Buddy 類的名字空間就是 Buddy,所以在定義 Buddy
的成員函數時,要使用完整的名字空間 Buddy::setBuddy()。在主函數中, Buddy 類生成出

對象 b,對象 b 就具備了 Buddy 類的全部特性,但又保持了獨立的數據空間。直接訪問 b
對象內 private 成員是非法的,所以只能使用 public 成員來訪問 private 成員。假如 buddy
類生成出另一個 c 對象,那麼 c 對象與 b 對象也是相互獨立的,具備各自的結構。


類作用域和訪問類成員
類的作用域是整個文件,類的成員數據和成員函數的作用域在該類之中。類的所有成
員函數在類的內部都可以直接訪問其他類成員,並且可以按名稱引用。在成員函數中定義
的變量,作用域是該函數。如果成員函數定義了與類成員具有相同名稱的數據,要訪問同
名的類成員需要加入作用域解析運算符( ::),如下例所示。


從實現中分離接口

良好的軟件工程習慣要求接口與實現分離。這種方式使程序的修改更爲容易,正如使
用類的程序所關心,只要類的接口沒有變化,對類內部的改變不會影響程序的其他部分。
例如聯繫人信息類的定義,可以放在兩個文件中。

( 1)類的接口 buddy.h

( 2)類的實現 buddy.cpp


控制訪問成員

成員訪問說明符共有 3 個,分別是 public、 private 和 protected。 public 說明符表示該
成員可以在該類以外被訪問,這種成員通常是作爲類的接口函數或數據。 private 說明符表
示該成員只能被該類的其他成員訪問,這樣類的數據可以得到保護。 protected 說明符表示
該成員可以被該類和該類的子類所訪問,在類的繼承時需要用到該概念。
類成員的默認訪問模式是 private,因此類定義的開始到第一個成員訪問說明符之間的
所有成員都是 private 成員。在每個成員訪問說明符之後,由該成員說明符所調用的模式將
在下一個成員訪問說明符或者類定義結束之前保持有效。成員訪問說明符可以重複,但通
常將同一類成員放在一起說明,這樣可避免混淆。

構造函數和析構函數

析構函數的作用是在對象結束時清理對象的成員數據。析構函數的名稱是在類的名稱
前加上一個“ ~”符號。如果在類中使用了動態內存分配,那麼就可以使用析構函數在對
象結束時釋放該內存空間。


const 對象和 const 成員函數

const 修飾符的作用是聲明常量型的變量,修改 const 類型的數據將引起編譯錯誤。對
象也可以被定義爲 const 類型,這樣該對象內的數據就不能再修改。

當對象 b 被定義爲 const 類型後,任何途徑對成員數據的修改都是非法的。 C++語言還
規定,只有被定義爲 const 類型的成員函數才能訪問 const 類型對象的數據。即使成員函數
Buddy::printBuddy()不會修改該對象的數據,也被拒絕訪問。所以當對象被當作 const 類型
使用時,需要用到的成員函數必須定義爲 const 類型


friend 對象和 friend 類

friend 被稱作友元。類的 friend 函數並不是該類的成員函數,但被定義爲該類的友元
後, friend 函數可以訪問類的 private 成員。定義 friend 函數需要在類的定義說明

friend 函數引用的參數是類的地址,通過類的地址就可以訪問該類的成員。這一用法與指針的原理是相似的。

類也可以作爲另一個類的友元,例如 Class2 類作爲 Class1 類的友元,那麼需要在 Class1類的定義中將 Class2 類定義爲友元

友元關係是授予的而不是獲取的,也就是說 Class1 必須授予 Class2 爲友元。而且,友元關係是不對稱的,也不能傳遞。如果 Class2 是 Class1 的友元, Class3 又是 Class2 的友元,不能推出 Class3 是 Class1 友元的結論。


this 指針

this 指針是類定義中指向自身的指針。每個對象都可以通過 this 指針來訪問它自己的
地址。對象的 this 指針並不是對象本身的組成部分,它不佔用對象的內存空間。在每次非
static 成員函數調用對象的時候, this 指針作爲隱藏的第一個參數由編譯器傳遞給對象。
this 指針隱含地引用對象的成員數據和成員函數,也就是說,在成員函數的定義中,
引用的每個成員前都有一個 this 指針。 this 指針也可以顯式地使用


動態內存分配

在 C 語言中,動態分配內存可使用 malloc()和 free()函數,這種分配方式必須指定分配
內存空間的長度。 C++語言提供了 new 和 delete 運算符執行動態內存分配,這種分配方式
優於 C 語言的分配方式。

申請內存一般形式是:
指針名 = new 數據類型;
釋放內存的形式爲:
delete 指針名;


static 類成員

在 C 語言中, static 修飾符用來定義靜態數據類型。如果將類成員數據定義爲 static 類
型,那麼該類生成的所有對象將使用同一個內存空間保存該成員數據。

該程序中 3 條輸出結果是相同的,因爲這 3 個對象中的數據成員 count 共享一個內存
空間。程序運行時,每個對象在內存中都會獲得類的所有成員數據的一個副本, static 成員
數據則是在編譯時就劃分了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章