C 學習筆記(四)

2021-04-13 14:03:11 字數 1377 閱讀 3265

指標是指向一些記憶體位址的變數,既可以是資料的位址也可以是函式的位址。所以,可以在執行時改變指標指向的內容。c++的成員指標(pointer-to-member)遵從同樣的概念,除了所選擇的內容是在類中之內的成員指標。這裡麻煩的是所有的指標需要位址,但在類內部是沒有位址的;選擇乙個類的成員意味著在類中偏移。只有把這個偏移和具體物件的開始位址結合,才能得到實際位址。成員指標的語法要求選擇乙個物件的同時間接引用成員指標。

為了理解這個語法,先考慮乙個簡單的結構:如果有乙個這樣結構的指標sp和物件so,可以通過下面方法選擇成員:

//******structure.cpp

*ip=

4;最後,考慮如果有乙個指向乙個類物件成員的指標,如果假設它代表物件內一定的偏移,將會發生什麼?為了取得指標指向的內容,必須用*號間接引用。但是,它只是乙個物件內的偏移,所以必須也要指定哪個物件。因此,*號要和間接引用的物件結合。所以,對於指向乙個物件的指標,新的語法變為->*,對於乙個物件或引用,則為.*,如下所示。

objectpointer

->*

pointertomember =47

;object.*

pointertomember =47

; 現在,讓我們看看定義pointertomember的語法是什麼?其實它像任何乙個指標,必須說出它指向什麼型別。並且,在定義中也要使用乙個『*』號。唯一的區別只是它必須說出這個成員指標使用什麼類的物件。當然,這是用類名和作用域運算子實現的。因此,可表示如下:

intobjectclass::

*pointertomember;

定義乙個名字為pointertomember的成員指標,該指標可以指向在objectclass類中的任一int型別的成員。還可以在定義的時候初始化這個這個成員指標。

intobjectclass::

*pointertomember =&

objectclass::a;

因為僅僅提高了乙個類而非那個類的物件,所以沒有objectclass::a的確切「位址」。因為,&objectclass::a僅是作為成員指標的語法被使用。

下面例子說明了如何建立和使用指向資料成員的指標:

//pointertomemberdata.cpp

#include 

<

iostream

>

using

namespace

std;

a =47

, b 

=***x(隨機值), c =49

顯然,除了對於一些特例(即需要精確地指向的),這裡就顯得有些過於難用而無法隨處使用。

另外,成員指標是受限制的,它們僅能被指定給在類中的確定的位置。例如,我們不能像使用普通指標那樣增加或比較成員

指標。以上摘至《c++程式設計思想》第一卷。

C 學習筆記四

15 友元函式 1.為什麼要引入友元函式?在對某些成員函式多次呼叫時,由於引數的型別檢查和安全性檢查都需要時間開銷,從而影響了程式的執行效率,引入友元後可以提高程式的執行效率 2.使用格式 a.是一種定義在類外部的 類 或 普通函式 但需要在類體內進行說明 前面加 friend關鍵字 b.不是成員函...

c 學習筆記 四 get set

c 中屬性是類,介面,結構的命名成員,可以通過get set訪問器訪問私有成員.如 public class animal private string name public string name getreturn name setname value 通常屬性名稱與要訪問的內部成員名稱相同,...

C 學習筆記 Thinking in C 四

1 運算子過載 1 class byte 2 12 3 關鍵字explicit c 提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。顯示宣告 ce e 1 ce e2 e1 這種顯式呼叫外,其它都是非顯式的...