類
現實世界中的物體可以抽象出類別的概念,對應于計算機世界就有一個類(class)的概念,因為類是一個抽象的概念的對應體,所以計算機不給它分配記憶體,只有當類實體化為物件時,給物件分配記憶體

類是設計的產物,物件是對類的實體化,設計型別時并沒有給其開辟空間,實體化為物件后開空間,我們操作的是物件,而不是類
C++類的設計
C++中,類是一種資料型別,客觀事物是復雜的,要描述它必須從多方面進行,也就是用不同的資料型別來描述不同的方面,類把資料(事物的屬性)和函式(事物的行為、操作)封裝為一個整體,如商場中的商品可以這樣描述:
- 商品名稱(用字串描述),該商品數量(用整數描述), 該商品單價(用浮點數描述),該商品總價(用浮點數描述),
class CGoods { public: char Name[21]; int Amount; float Price; float Total_value; };//最后的分號不可少 - 關鍵字class是資料型別說明符,指出下面說明的是類,識別符號CGoods是商品這個類的型別名,花括號中是構成類體的一系列成員,關鍵字public是一種訪問限定符
訪問限定符有三種:private,protected、public,如果在類起始點無訪問說明符號,系統默認為private
設計一個類的一般格式為:
class 類名
{
private:
成員表1;
public:
成員表2;
protected:
成員表3;
};
成員函式的定義
函式定義通常在類的說明之后進行,其格式如下:
回傳值型別 類名::函式名(引數表)
{
//函式體
}
:: 稱為作用域決議運算子,它指出該函式是屬于那一個類的成員函式
物件(instance)
物件是類的實體,宣告一種資料型別只是告訴編譯系統該資料型別的構造,并沒有預定記憶體,設計出來的類只是一個樣板,以此樣板可以在記憶體中開辟出同樣結構的實體——物件,
創建類的物件可以有兩種方法:
- 直接定義類的實體物件,創建在堆疊區:CGoods Car; int I;
- 動態創建類的物件,創建在堆區:CGoods *p = new CGoods();
有兩種方法存盤物件:
第一種方法是為每一個物件都分配全套的記憶體來存屬性和方法,包括安放成員資料的資料區和安放成員函式的代碼區

但是區別同一個類的各個不同物件的屬性是由資料成員決定的,不同物件的資料成員的內容是不一樣的;而行為(操作)是用函式來描述的,這些操作的代碼對所有的物件都是一樣的,因而為每個物件都存盤一份函式代碼會造成空間上的浪費
第二種方法僅為每個物件分配一個資料區,代碼區(放成員函式的區域)為各物件所共用

C++采用第二種方法存盤物件,不同的物件有各自的屬性,但是方法都是同一個方法,那么方法是怎么區別它操縱的到底是哪個物件的資料呢?這就是this指標的來源與用處所在
this指標
C++編譯器對C++編譯的時候,有三個步驟:
- 識別類里面的屬性成員
- 識別方法,只識別方法的宣告
- 改寫類的方法(函式)成員
改寫的具體有如下:
對于如下方法:
void CGoods::RegisterGoods(char name[], int amount, float price)
{
strcpy(Name, name);
Amount = amount;
Price = price;
}
編譯器會改寫為:
void CGoods::RegisterGoods(CGoods *const this, char name[],int amount,float price)
{
strcpy(this->Name, name);
this->Amount = amount;
this->Price = price;
}
在類里面識別到的屬性和類成員函式屬性同名時,就會加上this指標,這是編譯器編譯時自動加的,我們也可以手動加,編譯時系統就不給你加了
在主函式中呼叫類的成員函式時:
int main()
{
CGoods x;
CGoods y;
x.RegisterGoods("C++",16,94);
y.RegisterGoods("Java",10,88);
}
呼叫的那兩句就等價于
RegisterGoods(&x,"C++",16,94);
RegisterGoods(&y,"Java",10,88);
這樣,通過this指標就解決了上述的問題:“ 不同的物件有各自的屬性,但是方法都是同一個方法,那么方法是怎么區別它操縱的到底是哪個物件的資料呢 ”
下面給出this指標的基本定義:
this指標是類的一個自動生成、自動隱藏的私有成員,它存在于類的非靜態成員函式中,指向被呼叫函式所在的物件,全域僅有一個this指標,當一個物件被創建時,this指標就存放指向物件資料的首地址,
每一個物件都隱式包含一個指標,指向物件自身,當物件呼叫成員函式時,會默認將物件自身傳遞給該函式,在函式體內不直接使用該物件名,而是使用this指標,即this指標指向該物件自身,即指向呼叫者
行內函式
直接在類內定義的函式或用inline關鍵字修飾的定義在類外的函式稱為行內函式,行內函式在呼叫時直接拷貝一份過去,提高了效率,以空間換時間
如果一個函式是行內的,那么在編譯時,編譯器會把該函式的代碼副本放置在每個呼叫該函式的地方,因而對行內函式進行任何修改,都需要重新編譯函式的所有客戶端
inline關鍵字只是給編譯器行內的建議,至于會不會真的行內,編譯器會根據函式具體規模權衡時間空間效率之后選擇是否行內
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/191591.html
標籤:其他
下一篇:Cado-nfs安裝
