類的成員函式

2021-07-02 01:42:05 字數 2776 閱讀 4459

定義類的成員函式

儘管所有成員都必須在類的內部宣告,但是成員函式體可以定義在類的內部也可以定義在類外。

定義在類的內部的函式隱式inline函式

引入this

成員函式通過乙個名為this的額外的隱式引數來訪問呼叫它的那個物件。當我們呼叫乙個成員函式時,用請求該函式的物件位址初始化this。例如,如果呼叫

total.isbn()

//偽**

sales_data::isbn(&total)

其中,呼叫sales_data的isbn成員時傳入了total的位址。

因為this的目的總是指向「這個」物件,所以this是乙個常量指標

引入const成員函式

std:string isbn() const

緊隨引數列表之後的const關鍵字,這裡,const關鍵字的作用是修飾隱式this指標的型別。

預設情況下,this的型別是指向類型別非常量版本的常量指標。例如在sales_data成員函式中,this的型別是sales_data *const。儘管this是隱式的,但它仍然需要遵循初始化規則,意味著(在預設情況下)我們不能把this繫結到乙個常量物件上去。這一情況也就使得我們不能在乙個常量物件上呼叫普通的成員函式。

如果isbn是乙個普通函式而且this是乙個普通的指標引數,則我們應該把this宣告為const sales_data *const。畢竟,在isbn函式體內不會改變this所指的物件,所以把this設定為直線常量的指標有助於提高函式的靈活性。

然而,this是隱式的並且不會出現在引數列表中,所以在哪兒將this宣告成指向常量的指標就成為我們必須面對的問題。c++的做法是允許把const關鍵字放在成員函式的引數列表之後,此時,緊跟在引數列表之後的const表示this是乙個指向常量的指標。

像這樣使用const的成員函式被稱作為常量成員函式(const member function)

可以把isbn的函式體想成這樣

//偽**,說明隱式的this指標是怎麼工作的

//this是乙個指向常量的指標,因為isbn是乙個常量成員

std::string sales_data::isbn(const sales_data *const this)

常量物件,常量物件的引用或指標都只能呼叫常量成員函式。

任何不會修改資料成員的函式都應該宣告為const型別。

const類物件只能呼叫被宣告為const的成員函式,而普通的類物件可以呼叫非const或const成員函式

小結

1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;

2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;

3)作為一種良好的程式設計風格,在宣告乙個成員函式時,若該成員函式並不對資料成員進行修改操作,應心可能將該成員函式宣告為const 成員函式。

補充:const限定符

cosnt限定符修飾的變數,試圖修改該變數的值都被編譯器視為錯誤。

除了兩種例外情況(將在const章節和型別轉換和繼承中介紹,c++ primer 5th,p47),指標的型別和其所指向物件的型別必須匹配。

在初始化的過程中,不在乎型別是否為const,因為不會改變該物件。

const預設只在檔案內有效,在多個檔案中共享const物件,需要在變數定義和宣告時都加上extern。

不允許乙個非常量引用指向乙個常量物件

const int ci = 1024;

int &r2 =ci;                            //錯誤,r2為非常量引用,ci為常量物件

允許用任意表示式作為初始值,初始化常量引用,只要該表示式可的結果可以裝換成引用的型別。

int i =42;

const int &r1  = i;

const int &r2 = 42;

const int &r3 = r1*2;

int &r4 = r1*2;                       //錯誤不允許讓乙個普通的非常量引用指向乙個常量物件

對於指標也類似,只不過指標是物件,多一些內容

指向常量的指標(pointer to const)不能改變所指向的物件的值。

想要存放常量物件的位址,只能使用指向常量的指標(這就是為什麼對於定義常量成員函式,因為常量物件呼叫成員函式,我們需要將this宣告為指向常量的指標,也就有了常量成員函式)。

const double pi = 3.14;

double *ptr = π                        //錯誤,ptr是普通的非常量指標,不能存放常量物件的位址

const double *cptr = π            //正確

與引用類似的的一種例外

允許乙個指向常量的指標指向乙個非常量物件。

double dval = 3.14;

cptr = &dval。

類的成員函式

一 建構函式 1 定義 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次。2 特性 a 函式名與類名相同。b 無返回值。c 物件例項化時編譯器自動呼叫對應的建構函式。d 建構函式可以過載。e 如果...

指向類資料成員 類成員函式的指標

成員指標是指可以指向類的非靜態成員的指標,一般情況下指標指向乙個物件,但是成員指標指示的是類的成員,而非類的物件,類的靜態成員不屬於任何物件,因此無須特殊的指向靜態成員的指標,指向靜態成員的指標與普通指標沒有什麼區別,成員指標的型別囊括了類的型別以及成員的型別,當初始化乙個這樣的指標時,我們令其指向...

類的靜態成員函式

在一次 移動和重組編輯中,發現有一些函式是幾個類共用的一些演算法實現函式,使用了類的靜態成員函式。新增乙個類utility,如下所示 class utility 在使用該靜態成員函式時 if utility incircle 直接使用類名作為限定符來呼叫靜態成員函式即可,不需要宣告該類的物件。也可以...