天天看點

C++的成員指針定義方式與使用

對象的成員是要占用存儲空間的,是以對象也是有指針的,因為C++非常強調類型安全和編譯時檢查,是以C++的指針一共被分為4類,而且之間不能随便轉換:

  1. 資料指針
  2. 函數指針
  3. 資料成員指針
  4. 成員函數指針

資料指針和函數指針是普通指針,C語言裡也有,而後面的兩種,資料成員指針和成員函數指針被稱為成員指針,是C所沒有而C++才有的。

成員指針是指向類的某一個成員的指針,它的類型與類的類型和成員的類型有關,它隻應用于類的非靜态成員。(類的靜态成員是為類所有,不屬于任何對象,是以靜态成員指針用的是普通指針。)

下面是成員指針的定義方式:

1.定義資料成員指針的一般定義形式:資料成員類型 類名::*指針變量名=成員位址初值;

        舉個例子:String Data::*ptr_x=&Data::x;(其中x是類Data的資料成員,而這個資料成員是String類型的。)

2.定義成員函數指針的一般形式為:

  • 傳回類型  (類名::*指針變量名) (形式參數清單) = 成員位址初值;
  • 傳回類型  (類名::*指針變量名) (形式參數清單) const = 成員位址初值;

注意:定義成員函數指針時,必須確定在3個方面與它所指向的函數的類型相比對

①函數形參的類型和數目,包括成員是否為const(是否是常成員函數);

②傳回類型;③所屬類的類型。

舉栗子:“char get() const”成員函數的指針可以這樣定義和初始化:

  • char ( Data::*ptr_func ) ( ) const = &Data::get;//注意取位址符号&後面的get沒有括号
  • 或者也可以這樣,先為成員函數指針使用類型别名,例如:

        typedef char ( Data::*GETFUNC ) ( Data::index, Data::index ) const;  //Data::是類限定,index對應的函數參數的類型

        GETFUNC ptr_func = &Data::get;

說了資料成員指針和成員函數指針的定義方式,那麼怎麼使用呢?其實和普通指針的使用方式沒啥差別,下面來看一段代碼:

C++的成員指針定義方式與使用

或許有同學會問,啰裡啰嗦講了這麼多成員指針的知識,那麼什麼情況會用到成員指針呢?目前為止我還沒找到特别合理的該用成員指針的地方,下面貼一張和大佬的聊天圖....

C++的成員指針定義方式與使用

下面是一個很好消化的栗子:

C++的成員指針定義方式與使用

繼續閱讀