C 物件導向 類和物件的使用(二)

2021-09-05 17:45:49 字數 3173 閱讀 2850

目錄

物件指標

1、指向物件的指標

2、指向物件成員的指標

3、指向當前物件的 this 指標

共用資料的保護

1、常物件

2、常物件成員

3、指向物件的常指標

4、指向常物件的指標

5、物件的常引用

6、const 型資料小結

指標不僅可以指向普通變數,也可以指向物件。

乙個物件儲存空間的起始位址就是物件的指標。換句話說,定義乙個指標變數,去存放物件的位址,這就是指向物件的指標變數。其一般形式為: 類名 *物件指標名 。

time *p;    //指向 time 類的指標變數

time t;

p=&t; //將物件t的起始位址賦給指標p

time t ;

int *p ;

p=&t.hour ;

cout<<"hour="<<*p 《需要注意的是,類中的資料成員需要是 public 型別的,但一般資料成員都是 private ,所以這種指標很少會用到。

int (*p)() ; //定義乙個指向 int 型函式的指標變數

p=max ; //將 max 函式的入口位址賦給指標變數 p ,p此時就指向了函式 max

(*p)() ; //呼叫函式 max

而指向物件成員函式的指標卻不能像指向普通函式一樣

p = t.show ;
因為現所需要呼叫的函式是屬於乙個類,用指標指向時需指明是屬於哪個類。

void (time:: *p)();

p=&time::show;

定義指向公用成員函式的指標變數的一般形式為: 資料型別名(類名:: *指標變數名)(引數列表);使指標變數指向乙個公用成員函式的一般形式為: 指標變數名 = & 類名:: 成員函式名 。

下面列乙個例子有助於了解一下:

class time

void show()

注意關於指向物件的成員函式的指標,其成員函式的入口位址正確寫法是 (p2=&time::show),而不是(p2=&t.show),前面已提到過,成員函式不是存放在物件的空間中,而是在物件外的空間,如果有多個同類的物件,它們是公用的乙個函式**段。還可以簡寫:

void (time :: *p2)()=&time::show ; 

(t.*p2)();

在每乙個成員函式中都包含有乙個特殊的指標,這個指標有個固定的名字 ,稱為 this ,它是指向本類物件的指標,它的值是當前被呼叫的成員函式所在的物件的起始位址。例如,當呼叫成員函式 t.show() 時,編譯系統就把物件 t 的起始位址賦給 this 指標,於是在成員函式引用資料成員時,就按照 this 指標的指向找到物件 t 的資料成員 。

//show()函式輸出時分秒 hour:min:sec ,實際上是執行:

this->hour : this->min : this->sec

//由於當前的 this 指向 t ,故相當於執行:

a.hour : a.min : a.sec

this 指標時隱式使用的,它是作為引數被傳遞給成員函式。本身成員函式 show()的定義是:

void show()

void show() const

time (int h=1 ,int m=0 , int s=0):hour(h)

注意是只能通過建構函式的引數初始化表進行初始化!,可以試一下用建構函式的其他初始化方式,發現都會出錯,因為其他建構函式的初始化操作仍屬於對常資料成員的賦值操作。

time()

time(int h)

常物件的資料成員都是常資料成員,因此在定義常物件時,建構函式只能用引數初始化表對常資料成員進行初始化

前邊已提過常成員函式只能訪問本類中的資料成員,而不能進行修改。

宣告常成員函式的一般形式是:型別名 函式名(參數列) const ;。和宣告常物件時不一樣,const 只能放在最後(函式名和括號之後)。另外不要忘記的是const 是函式型別的一部分,在宣告函式和定義函式時都需要有 const 的關鍵字,只有在呼叫時不需要加 const 。如下:

class time

void show() const

int main()

//物件的常引用

void set(const time &t)

int main()

在程式設計中,經常用常指標和常引用用作函式引數,這樣既能保證資料安全,是資料不能被任意修改,在呼叫函式時又不必建立實參的拷貝。後邊會了解到,每次呼叫函式建立實參的拷貝時,都需要呼叫複製建構函式,有時間開銷。用常指標和常引用作函式引數時,可以提高程式執行效率。

從最開始的常物件、常物件成員,這部分還好,認識都比較清晰,但到了指向物件的常指標、指向常物件的指標,在形式上也是能分清,但它們的功能有的都是相互交錯,很容易就混淆了,下面稍微總結一下 const 的用法。

形式含義

time const t ;

t 是常物件,其值在任何情況下都不能被改變。

void time :: show() const ;

show是 time 類中的常成員函式,可以引用,但不能修改本類中的資料成員。

time * const p ;

p 是指向 time 類的常指標變數,p 的值(其指向)不能改變。

const time * p ;

p 是指向 time類常物件的指標變數, p 指向的類物件的值不能通過 p 來改變。

const time &t1=t ;

t1 是 time 類的物件 t 的引用,二者指向同一儲存空間,t 的值不能被改變。

const 型別資料是很重要的,這部分的內容比較繁瑣難記,在學習時不必死記,對它有一定的了解即可,以後有不會的就再回顧一下,加深理解,慢慢就掌握了。

C 物件導向 類和物件的使用(一)

這部分算是正式接觸了類和物件,涉及到它們基礎的應用。目錄 建構函式對類物件進行初始化 1 物件的初始化 2 建構函式實現資料成員的初始化 3 帶引數的建構函式 4 引數初始化表對資料成員的初始化 5 建構函式的過載 6 使用預設引數的建構函式 析構函式 建構函式與析構函式 物件陣列 當物件在建立時獲...

c 物件導向 類和物件

define crt secure no warnings include include using namespace std struct hero void printhero struct hero h class advhero class animal 以內 叫類的內部,以外叫類的外部...

物件導向 物件和類

類和物件使物件導向程式設計技術中的最基本概念。是現實或思維世界中的實體在計算中的反映,它將資料以及這些資料上的操作封裝在一起。類是抽象的,是建立例項物件的模板 是具有類型別的變數 是乙個乙個具體的例項 物件中包含類的屬性和方法 類和物件的區別就是 魚和三文魚 貓和藍貓的區別。class 類名稱 cl...