C 拾遺 類成員指標

2021-06-29 05:08:21 字數 2174 閱讀 4101

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...