C 類和物件(三) C 物件模型和this指標

2021-10-19 00:27:17 字數 4441 閱讀 7750

c++中,類的成員變數和成員函式分開儲存。只有非靜態成員變數屬於類的物件,占用物件的記憶體空間

注1:非靜態成員函式靜態成員(包括靜態成員變數與靜態成員函式)均不屬於類的物件,不占用物件的記憶體空間

注2:非靜態成員函式並非某個物件獨有,記憶體中僅存在乙份資料(乙份函式例項)。不同物件的某個非靜態成員函式共享同乙個函式例項,即多個同型別的物件會共用一塊**。

注3:空物件占用記憶體空間大小為1位元組。每個物件均具有獨一無二的記憶體位址,c++編譯器為區分不同的空物件,會為每個空物件分配1個位元組的記憶體空間。

示例

#include

using

namespace std;

//空類

class

empty

;class

object

//靜態成員函式:不屬於類的物件,不占用物件的記憶體空間

static

void

s_func()

};intmain()

c++提供特殊的物件指標this指標,用於區分共享的同一塊**(如非靜態成員函式)由某個物件呼叫。

this指標的特點

(1)this指標指向被呼叫的成員函式所屬的物件(某個物件呼叫成員函式,this指標即指向該物件)。

(2)this指標是隱含在每個非靜態成員函式內的一種指標。

(3)this指標無需定義,可直接使用

this指標的本質:this指標本質是指標常量,等價於資料型別* const this,即指標的指向不可修改,但指向的值可以修改

this指標的作用

(1)當成員變數函式形參同名時,可使用this指標區分,解決名稱衝突。

(2)在類的非靜態成員函式中,*this可表示物件本身。return *this;可返回當前物件:

①當函式以值型別返回,即返回型別為類型別,會呼叫拷貝建構函式建立並返回當前物件的拷貝

②當函式以引用型別返回,即返回型別為類型別 &,會返回當前物件本身

注1:this是指向物件的指標,可通過解引用操作*this獲取物件。

注2:this->成員屬性等價於(*this).成員屬性

總結:

①函式中建立並返回臨時物件時,函式返回型別應為值型別即類型別,而不能為引用型別

原因:臨時變數在函式呼叫完畢後釋放,若返回型別為引用型別即為同乙個物件,訪問已被釋放的記憶體為非法操作;應返回值型別,建立臨時物件的拷貝並返回。

②為保證鏈式程式設計風格或呼叫的物件全域性唯一時,函式返回型別應為引用型別即類型別 &,而不能為值型別

原因:若返回型別為值型別,會建立當前物件的拷貝並返回,呼叫與返回的物件不是同乙個物件;應返回引用型別,保證呼叫與返回同乙個物件

示例

#include

using

namespace std;

class

account

//以【引用型別】返回

account&

sum1

(account a)

//以【值型別】返回

account sum2

(account a)};

intmain()

c++中,空指標可呼叫成員函式

若成員函式中訪問成員變數時(即隱含地使用this指標時),需進行判空處理以保證**的健壯性。

//判空**if(

this

==null

)

示例:空指標訪問成員函式

//空指標訪問成員函式

#include

using

namespace std;

class

object

//成員函式中訪問成員變數(使用this指標)

void

func()

cout << field << endl;

//訪問成員變數時,等價於 this->成員變數}}

;int

main()

常函式:成員函式的形參列表後,使用關鍵字const修飾。

語法返回型別 函式名() const

特點:常函式內,成員變數不可修改

本質:成員函式後使用關鍵字const修飾,本質相當於修飾this指標指標常量),則this指標指向的值亦不可修改。

注1:this指標本質指標常量,等價於資料型別* const this,即指標的指向不可修改,但指向的值可以修改

注2:普通成員函式中,成員變數等價於this->成員變數this等價於資料型別* const this

常函式中,this等價於const 資料型別* const this,則this->成員變數指標的指向與指向的值均不可修改。若修改常函式中的成員變數的值,則編譯器報錯:表示式必須是可修改的左值

注3:當成員屬性宣告時,若使用關鍵字mutable修飾,則在常函式中仍然可以修改。

常物件:物件在宣告時,使用關鍵字const修飾。

特點

(1)常物件的成員變數不可修改

(2)常物件只能呼叫常函式。

注1:當成員屬性宣告時,若使用關鍵字mutable修飾,則在常物件中仍然可以修改。

注2:常物件不可呼叫普通成員函式,因為普通成員函式中成員屬性可修改,與常物件的成員變數不可修改相斥。否則,編譯器報錯:物件含有與成員函式***::func()不相容的型別限定符

示例

#include

using

namespace std;

class

object

/* 普通成員函式 */

void

func2()

};intmain()

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...

C 物件和類

1,特殊的類 字串string include include using namespace std int main 類似於標準庫函式,我們不需要記住每種 類 的全部操作,只需要在使用過程中記住一些常用的操作就可以了。如果有需要的話,可以求助於相關書籍或網路 2,當我們對string進行種種操作...

C (類和物件)

類成員函式 類的成員函式指標那些把定義和原型寫在類定義內部的函式,就想類定義中的其他變數一樣。類訪問修飾符 類成員可以定義為public,private或protected。預設情況下是定義為private。建構函式 類的建構函式是一種特殊的函式,在建立乙個新物件是呼叫。析構函式 類的析構函式也是一...