類成員指標
本文主要討論
c++中類成員的指標,這部分內容少有使用,也比較難於理解。
如果文中有錯誤或遺漏之處,敬請指出,謝謝!
需要使用類成員指標的情況是比較少見的,所以一般沒人使用這個語言特性。下面先介紹類成員指標的使用方法,再介紹它的可能應用場合。
有時,我們需要在類外的其它地方直接獲得類成員,這時我們就需要使用類成員指標。類成員指標與物件的指標不同,它不僅包括類的型別,還包括成員的型別。成員指標只應用於類的非
static
成員,因為
static
類成員不是任何物件的組成部分,只需使用普通指標即可。
宣告成員指標
借用書上的乙個例子,有這麼乙個類:
class screen ;
若要宣告
contents
成員的指標,應有如下形式:
string screen::*ps;
若要宣告
cursor
、height
或width
成員的指標,應有如下形式:
screen::index screen::*pi;
從上面的使用形式可以看出,使用類成員的指標與普通指標的區別在於,需要在類成員指標前面的加上類限定符,以指明是哪個類的成員指標。同樣,在初始化指標時,也只能用相應類的相應型別的成員對指標進行初始化,例如:
ps = &screen::contents;
pi = &screen::cursor;
上面介紹了對類資料成員的指標的使用方法,下面對函式成員的指標進行介紹。
函式成員的指標與普通函式指標相比,也多了類限定符。由於類成員函式還有可能是
const
,所以const
也成為成員函式指標宣告的一部分。也就是說,函式成員的指標必須在三個方面與它所指函式的型別相匹配:(1
)函式形參的型別和數目;(2
)返回型別及是否為
const
函式;(
3)所屬類的型別。
例如,要定義
screen
的get
成員的指標,可以如下定義:
char (screen::*pmf)() const = &screen::get; // not 'screen::get'!
char (screen::*pmf2)(screen::index, screen::index) const;
pmf2 = &screen::get;
這裡需要注意的是:(1)這裡不存在函式型別到函式指標型別的自動轉換(即類成員函式前面必須加上&,然後再給相應指標賦值);(2)運算子的優先順序關係(注意指標外層的括號所起的作用);(3)函式到指標的自動型別匹配(注意兩個過載版本的get對指標的賦值)。
使用類成員指標
要使用類成員指標所指物件,首先應當從類物件取得成員指標,再解引用指標,所以有如下兩種操作符供使用:.*和
->*
。這兩個操作符的左運算元必須是類型別的物件或類型別的指標,右運算元是該型別的成員指標。例如:
screen sc;
char c = (sc.*pmf)(); //
等價於呼叫
sc.get();
screen *ps = ≻
c = (ps->*pmf)();
下面給出成員指標使用的完整例子,以方便讀者更好的理解:
#include
<
string
>
class
screen
char
get(
index ht
,index wd
)const
private
:std
::string
contents
;index cursor
;index heigth
,width;};
void
func()
intmain()
成員指標的應用舉例
當乙個類有多個性質相同且型別相同的函式成員時,可以使用函式表來進行函式呼叫,產生用同一函式使用不同引數來達到不同操作的效果,而實際上是呼叫了不同的函式來實現的。下面給出這樣的乙個例子,方便讀者有乙個感性的認識:
#include
<
iostream
>
using
namespace
std;
class
screen
screen
&forward
()screen
&back
()screen&up
()screen
&down
()// function table
typedef
screen&(
screen::*
action
)();
static
action menu
;// specify which direction to move
enum
directions
;screen
&move
(directions
);};
screen
::action screen
::menu
=;screen
&screen
::move
(directions dirc)
intmain()
[1] c++ primer(edition 4)
[2] thinking in c++(edition 2)
[3] international standard:iso/iec 14882:1998
源文件 <
>
C 學習筆記4 指標
1.什麼是指標?指標是乙個變數,其值為另乙個變數的位址,即,記憶體位置的直接位址。在使用指標儲存其他變數位址之前,對其進行宣告。指標變數宣告的一般形式為 type var name type 是指標的基型別,它必須是乙個有效的 c 資料型別,var name 是指標變數的名稱。星號是用來指定乙個變數...
C 學習筆記 四 指標 1
函式存放在記憶體的 區域內,它們同樣有位址,我們如何能獲得函式的位址呢?如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同陣列一樣,陣列的名字就是陣列的起始位址。定義乙個指向函式的指標用如下的形式,以上面的test 為例 int fp int a 這裡就定義...
C語言學習筆記(四) 指標
c語言學習筆記 四 指標 include intmain p就是乙個指標,p就是取出p指向位址的值 陣列 相同型別的資料集合 include intmain 在這個程式中,p是乙個指標,a是乙個陣列,若p a 0 或者p a就是p指向陣列的第乙個元素,接下來就可以對p進行 1或 1進行偏移操作 in...