c++拾遺--類成員指標
類成員的型別與一般型別不同,那麼類成員的指標型別自然與一般型別的指標有所區別。我們有必要來**下類成員指標的使用。
類成員指標是指可以指向類的非靜態成員的指標。它的型別包括了類型別和所指向的成員型別。一般而言,指標指向的是物件,而類成員指標指向的是類成員而非類物件。
需要指出,類成員指標不是可呼叫物件,要想通過類成員指標呼叫類成員,需結合類物件或類指標。靜態型別成員屬於類,型別與普通指標相似。
一般的宣告形式:
成員型別 classname::*p;
它的賦值形式:
p = &classname::類資料成員;
這裡的取位址符&,是必須的。
#include using namespace std;
class myclass
};int main(void)
執行
在這個例子中,我們定義了兩個成員指標pa和pc。其中pc的宣告必須加上const,否則,稍後的賦值會發生型別不匹配的錯誤。我們還定義了類的物件和指標,它們分別通過成員指標訪問運算子.*和->*,對類成員指標進行訪問。
和資料成員指標類似,它的宣告同樣得指定類型別和函式成員型別。
返回型別 (classname::*pfun)(引數型別列表);
它的賦值形式:
pfun = &classname::類函式成員;
#include using namespace std;
class compute
int sub(int a, int b) const };
int main(void)
執行
這個例子就不多解釋了。只說一句:訪問限定符仍然有效,可在類外訪問的資料和函式才可以使用類成員指標呼叫。
通過mem_fn對類函式成員指標進行包裝,來返回乙個可呼叫物件。使用時,包含標頭檔案functional。
#include #include using namespace std;
class compute
int add()
int sub() const
private:
int a;
int b;
};int main(void)
執行
由於add方法是引數是void的,所有呼叫時,只傳遞類物件fun(com)或指標fun(p)即可。
若成員方法是帶引數的,該如何使用呢?看下面的**:
#include #include using namespace std;
class compute
int sub(int a, int b) const };
int main(void)
執行
這個示例顯示了,若是帶引數的,引數跟在類物件或類指標後面即可。
mem_fn會根據傳入的引數型別,自動選擇呼叫.*或->*:
compute com, *p = &com;
auto fun = mem_fn(&compute::add);
fun(com);//傳入物件,這一句會被解釋成 auto padd = &compute::add;(com.*padd)();
fun(p); //傳入指標,這一句會被解釋成 auto padd = &compute::add;(p->*padd)();
使用函式介面卡bind,繫結類函式成員,返回可呼叫物件。
在bind函式繫結中,已經有了詳細介紹。
本專欄目錄
所有內容的目錄
C語言指標拾遺
指標這種東西,是需要記錄下來才能理解的比較清晰,所以專門記錄一下指標的一些知識點 指標理解 指標也是一種資料型別,和其他各種資料型別基本一樣 指標有幾個要素 指標的的值,就是該指標變數的值,該值就是乙個記憶體位址的編號,這個記憶體位址就是該指標所指向的變數所處的記憶體位址 指標變數的變數名,該變數名...
C語言拾遺
main函式引數 c語言規定main函式引數只能有兩個,習慣上這兩個引數寫成argc和argv。c語言還規定argc必須是整形變數,argv必須是指向字串的指標陣列。因此,main函式的函式頭應該寫為 main argc,argv int argc char argv 或者 main int arg...
C 點滴拾遺
1.成員變數的初始化順序,與建構函式中初始化列表的順序無關,與成員變數申明的順序一致 多繼承中,基類的構造順序,與派生類的建構函式初始化列表中基類的構造順序無關,與定義派生類時基類的申明順序有關 2.友元關係不能繼承。3.指標和typedef typedef int pint int i 1 con...