1. 程式人生 > 其它 >【C++】C++類

【C++】C++類

技術標籤:# 資料結構與演算法分析(C++)

【C++】C++類

1.基本的class語法

類(class)由成員(members)組成,這些成員可以是資料也可以是函式。此時的函式叫做成員函式。類的每一個例項都是一個物件。每一個物件都包含有由類所指定的資料成分(除資料成分是 static 型的)。成員函式用於處理物件,所以成員函式也被叫做方法
許可權修飾符privatepublic。public屬性的成員可以被任何類中的任何方法訪問,而private屬性的成員只能被它所在的類中的方法訪問。物件是通過public成員函式來訪問的,將資料成員宣告為private型可以限制訪問類的內部細節,這叫做資訊隱藏

。在一個類中,所有的成員預設都是private的,因此初始的public是不可選的。
建構函式是一個描述如何構建類的例項的方法。如果沒有顯示定義的建構函式則使用語言預設功能自動生成將資料成員初始化的建構函式。

2.建構函式的附加語法和訪問函式

預設引數

如下程式碼:

class IntCell
{
	public:
		/*
		* 構建 IntCell 物件,初始化為0
		*/
		IntCell()
		{storedValue = 0;}
		/*
		* 構建 IntCell 物件
		* 初始化為傳入引數 initialValue
		*/
		IntCell(int initialValue)
{storedValue = initialValue;} ··· private: int storedValue; };

有引數是採用下方的建構函式,零引數時利用上面的建構函式。預設引數可以用於任何函式,但是最常見的還是用在建構函式上。

初始化表列

如下程式碼:

class IntCell
{
	public:
		explicit IntCell(int initialValue = 0)
			: storedValue{ initialValue }{ }     #5
		···
	private
: int storedValue; };

第5行使用了初始化表列,直接將資料成員初始化。用初始化表列代替函式體中的賦值語句幾乎沒有什麼區別,但是對於資料成員是類型別其初始化過程非常複雜的情況,使用初始化表列就節省時間了。但是有一些情況是必須的,例如資料成員為 const 型(即當物件被構建之後該 const 資料成員將不可改變),那麼該資料成員的值只能在初始化表列中被初始化。還有如果資料成員本身是一個類型別,並且該型別又沒有0作為引數的建構函式,那麼這個成員必須在初始化表列中被初始化。

explicit建構函式

我們應該使所有的單引數建構函式為explicit的,為避免後臺型別轉換。否則就會有一些寬鬆的法則允許不帶顯示強制轉換操作的型別轉換。
例如:

IntCell obj; 
obj = 37;

按理來說不應該編譯,因為型別不匹配,37不是 IntCell 型的,但是單引數建構函式定義了一個隱式型別轉換,在隱式轉換過程中就會建立一個臨時物件,這個物件使得賦值(或函式引數)相容,此時編譯器將把上述賦值轉化為

IntCell temporary = 37;
obj = temporary;

而 explicit 的使用則意味著單引數建構函式不能用來顯式的生成 temporary 。所以應用了 explicit 宣告編譯器就會正確的指出最開的型別不匹配的問題。

常成員函式

一個檢查但是不改變其物件狀態的成員函式叫做訪問函式。而改變狀態的函式叫做修改函式。因為其修改了物件的狀態。
在c++中可以把每個函式標記為訪問函式或者修改函式。修改函式不能用於常物件上。預設情況下所有的成員函式都是修改函式。要想使得成員函式為訪問函式,則必須在終止引數型別表列的封閉圓括號的後面加上關鍵字 const(以後再討論) 。這種常態性特徵的一部分。
例如:

class IntCell
{
	public:
		···
		int read() const
		{return storedValue; }
}

【未完待續···】