對象的成員是要占用存儲空間的,是以對象也是有指針的,因為C++非常強調類型安全和編譯時檢查,是以C++的指針一共被分為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;
說了資料成員指針和成員函數指針的定義方式,那麼怎麼使用呢?其實和普通指針的使用方式沒啥差別,下面來看一段代碼:
或許有同學會問,啰裡啰嗦講了這麼多成員指針的知識,那麼什麼情況會用到成員指針呢?目前為止我還沒找到特别合理的該用成員指針的地方,下面貼一張和大佬的聊天圖....
下面是一個很好消化的栗子: