首先讓我們看一下,乙個簡單的成員變數指標 和 成員函式指標的使用例子。
struct a
};int a:: * pi = &a::i;
void (a::* pfoo)() = &a::foo;
a a;
a.*pi = 1; //等同於 a.i = 1
(a.*pfoo)(); //等價於 a.foo();
在vc++ 下,輸出 &a::i 和 &a::foo 的值,你會發現他們的值都為1
在上面的例子中, pi 型別是 int a::*, pfoo 的型別是 void
我們可以 把成員指標的型別 抽象成如下表示式:
template
using memberpointer = type class::*;
// 1. 類中資料成員的指標, 那麼 type 就是 變數的型別
// 2. 類中函式成員的指標, 那麼 type 就是 函式的型別
// 例如 void func(int) 的函式型別 type 等同於 typedef void(type)(int)
成員指標的賦值可以抽象為如下**
type c::* p = c::member;
// member 是c 類中的成員資料或成員函式,其型別為 type;
需要注意的是,成員指標只能運用於 非靜態函式, 如果是靜態成員。如果是靜態成員,&t::member 返回的就是實際的記憶體位址。
成員函式指標的呼叫必須通過類物件,和操作符 .* 或 ->*
int a:: * pi = &a::i;aa
;a.*pi; // 等同於 a.i
a* a_ptr
;a_ptr->*pi; // 等同於 a_ptr->i;
通過上面使用的說明,其實可以發現, 成員指標指向的並不乙個特定物件的特定成員,而是乙個類的特定成員。那麼它必然不可能是乙個具體的記憶體上的位址。 通常情況下,我們可以將其理解為 成員 在類中的偏移量(相對於 類的起始位址而言)。
同乙個成員在在所有物件的偏移量是一致的,那麼當我們 有乙個物件時,通過偏移量 就能呼叫到 這個物件 特定的成員。
C 類成員指標
類成員指標 1.成員指標式可以指向類的非靜態成員的指標。類的靜態成員不屬於任何物件,因此無需特殊的指向靜態成員的指標。指向靜態成員的指標的普通指標沒有任何區別。2.當初始化乙個類成員指標時,我們令其指向類的成員,但不指定代成員所屬的物件,直到使用到成員指標時,才提供所屬的物件。3.資料成員指標 例 ...
C 類成員指標
類成員指標時指可以指向類的非靜態成員的指標,一般情況下,乙個指標指向乙個物件,但是成員指標指示的是類的成員,而非類的物件。指向類的靜態成員的指標和普通指標沒有什麼區別。與普通指標不同的是,類資料成員指標必須在 前新增classname 以表示當前定義的指標可以指向classname的成員。class...
C 類成員函式指標
使用類成員函式指標需要掌握的三點。1 申明類成員函式指標 2 通過物件指標呼叫類函式指標 3 通過物件呼叫類函式指標 例 定義基類和子類 class base virtual void print2 class derived public base virtual void print2 申明類成...