成員變數/函式指標的用法 (轉)
說明:
這是今天看《thinking in c++》的第10章時作的"筆記",前面也有人
問到關於成員指標的問題,我那時說直接傳入this指標,現在看
了書後有多了一種方法,不過,它的語法有點難計。
這下回去可以看看MFC的訊息對映/動態建立是怎麼寫的了,我想也應
該是成員函式指標把
指標是指向一些地址的變數,既可以是資料的地址也可以是函式的地址。C++的
成員指標遵從同樣的原則。困難的是所有的指標需要一個地址,但在類內部沒有地
址;選擇一個類的成員意味著在類中偏移。只有把這個偏移和具體的開始地址
結合,才能得到實際地址。成員指標的語法要求選擇一個物件的同時逆向引用成員
指標。
struct simple { int a ; }
simple so;
simple* sp = &so;
如果有一個這個結構的指標sp和物件so,如果有一個指標指向一個類物件成員,甚至
假設它代表物件內一定的偏移,將會發生什麼?為了取得指標指向的內容,必須用*號逆向引用。但是,它只是一個物件內的偏移,所以還必須要指定那個物件。因此,*號要和逆向引用的物件結合。
sp->*pm = 47; so.*pm = 47;
定義pm的語法是什麼?其實它像任何一個指標,必須說出它指向什麼型別。並且,在定義中也要使用一個‘*’號。唯一的區別只是必須說出這個成員指標使用什麼類的物件。當然,這是用類名和全域性運算子實現的:
定義成員指標:
int simple::*pm;
定義並初始化成員指標:
int simple::*pm = &simple::a;
因為引用到一個類而非那個類的物件,因而,&simple::a僅可作為成員指標的語法表示。
指向函式的指標定義像下面的形式:int(*fp)(float); (*fp)的圓括號用來迫使
正確判斷定義。沒有圓括號,這個就是一個返回int*值的函式。為了定義和使用一個成員函式的指標,圓括號扮演同樣重要的角色。假設在一個結構內有一個函式:
struct simple2 { int f(float); };
透過給普通函式插入類名和全域性運算子就可以定義一個指向成員函式的指標:
int(simple2::*fp)(float);
初始化:
int(simple2::*fp)(float) = &simple2::f;
&號是可選的;可以用不帶參數列的函式識別符號來表示地址:fp = simple2::f;
使用:
simple2 s2;
int i = (s2.*fp)(1.5);
另一個使用例子
class CB
{
int f1(){ return 1; }
int f2(){ return 2; }
int (CB::*fptr[2])();
public:
CB() { fptr[0] = CB::f1; fptr[1] = &CB::f2; }
int sel(int i){ return (this->*fptr[i])(); }
};
在建構函式中,成員指標的初始化似乎被過分地指定了。是否可以這樣寫:
fptr[1] = f2; 因為名字f2在成員函式中出現,是否可以自動地認為在這個類範圍內呢?問題是這不符合成員函式的語法,語法要求編譯器能夠判斷將要進行什麼。當成員函式被逆向引用時,它仍被過分地指定了,this似乎多餘。正如前面所講的,當它被逆向引用時,語法也需要成員指標總是和一個物件繫結在一起。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989077/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用成員函式指標函式指標
- 指標的用法指標
- 函式指標使用c++類成員函式函式指標C++
- 函式指標的重要用途——回撥函式函式指標
- C++ 返回函式指標的函式C++函式指標
- C++智慧指標作為成員變數C++指標變數
- c語言函式指標的定義C語言函式指標
- c++智慧指標中的reset成員函式C++指標函式
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- C/C++中函式指標的含義C++函式指標
- C/C++——指向函式的指標和指向函式的指標的陣列C++函式指標陣列
- 淺談C++指標直接呼叫類成員函式C++指標函式
- 成員函式的說明和使用(轉)函式
- 巨集_變數_函式_指標_標頭檔案變數函式指標
- 函式不能返回區域性指標變數函式指標變數
- C: (pointer) 陣列變數和指標的區別陣列變數指標
- C++ 中 this 指標的用法詳解C++指標
- 成員變數和區域性變數變數
- 獨一無二----靜態成員變數 (轉)變數
- 【C++】函式返回函式指標的多種定義方式C++函式指標
- 浮點數轉換成字串函式字串函式
- 引入const成員函式函式
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- 靜態資料成員和靜態成員函式函式
- 為什麼 C++ 中成員函式指標是 16 位元組?C++函式指標
- 型別的本質:對變數、型別、指標的理解型別變數指標
- 第十三篇:成員函式與非成員函式的選擇函式
- [教程]JScript中的變數引用規則(補充,函式用法說明) (轉)JS變數函式
- ConcurrentHashMap(一):常量,成員變數,靜態程式碼塊,內部類,spread函式,tabAt函式等詳解HashMap變數函式BAT
- C++:類的成員函式C++函式
- c++ const 成員函式C++函式
- 子父類中成員變數變數
- Swift 成員變數的get/setSwift變數
- 深入C++成員函式及虛擬函式表C++函式
- 【C++】函式返回資料指標的多種定義方式C++函式指標
- 成員變數和區域性變數的區別變數
- C++共享之道:用extern實現原始檔變數與類成員函式的巧妙共享C++變數函式
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標