C++拾遺--類成員指標

來源:互聯網
上載者:User

標籤:類成員指標   mem_fn   bind   

                      C++拾遺--類成員指標

前言

    類成員的類型與一般類型不同,那麼類成員的指標類型自然與一般類型的指標有所區別。我們有必要來探討下類成員指標的使用。

本文

類成員指標是指可以指向類的非靜態成員的指標。它的類型包括了類類型和所指向的成員類型。一般而言,指標指向的是對象,而類成員指標指向的是類成員而非類對象。

需要指出,類成員指標不是可調用對象,要想通過類成員指標調用類成員,需結合類對象或類指標。靜態類型成員屬於類,類型與普通指標相似。

資料成員指標

一般的聲明形式:

成員類型 classname::*p; 

它的賦值形式:

 p = &classname::類資料成員; 

這裡的取地址符&,是必須的。

#include <iostream>using namespace std;class Myclass{public:int a;const char c;Myclass(int a, int c) :a(a), c(c){}};int main(void){int Myclass::*pa;pa = &Myclass::a;const char Myclass::*pc;pc = &Myclass::c;Myclass my(520, 'C'), *p = &my;cout << my.*pa << endl;cout << p->*pa << endl;cout << my.*pc << endl;cout << p->*pc << endl;cin.get();return 0;}
運行



在這個例子中,我們定義了兩個成員指標pa和pc。其中pc的聲明必須加上const,否則,稍後的賦值會發生類型不符的錯誤。我們還定義了類的對象和指標,它們分別通過成員指標訪問運算子.*和->*,對類成員指標進行訪問。


函數成員指標

和資料成員指標類似,它的聲明同樣得指定類類型和函數成員類型。

傳回型別 (classname::*pfun)(參數類型列表);

它的賦值形式:

pfun = &classname::類函數成員; 

#include <iostream>using namespace std;class Compute{public:int add(int a, int b){return a + b;}int sub(int a, int b) const{return a - b;}};int main(void){int (Compute::*pfun1)(int, int);pfun1 = &Compute::add;int (Compute::*pfun2)(int, int) const;pfun2 = &Compute::sub;Compute com, *p = &com;cout << (com.*pfun1)(100, 10) << endl;cout << (p->*pfun1)(100, 10) << endl;cout << (com.*pfun2)(100, 10) << endl;cout << (p->*pfun2)(100, 10) << endl;cin.get();return 0;}
運行



這個例子就不多解釋了。只說一句:訪問限定符仍然有效,可在類外訪問的資料和函數才可以使用類成員指標調用。


mem_fn

通過mem_fn對類函數成員指標進行封裝,來返回一個可調用對象。使用時,包含標頭檔functional。

#include <iostream>#include <functional>using namespace std;class Compute{public:Compute(int a, int b) :a(a), b(b){}int add(){return a + b;}int sub() const{return a - b;}private:int a;int b;};int main(void){Compute com(100, 10), *p = &com;auto fun1 = mem_fn(&Compute::add);cout << fun1(com) << endl;cout << fun1(p) << endl;auto fun2 = mem_fn(&Compute::sub);cout << fun2(com) << endl;cout << fun2(p) << endl;cin.get();return 0;}
運行


由於add方法是參數是void的,所有調用時,只傳遞類對象fun(com)或指標fun(p)即可。

若成員方法是帶參數的,該如何使用呢?看下面的代碼:

#include <iostream>#include <functional>using namespace std;class Compute{public:int add(int a, int b){return a + b;}int sub(int a, int b) const{return a - b;}};int main(void){Compute com, *p = &com;auto fun1 = mem_fn(&Compute::add);cout << fun1(com, 100, 10) << endl;cout << fun1(p, 110, 10) << endl;auto fun2 = mem_fn(&Compute::sub);cout << fun2(com, 120, 10) << endl;cout << fun2(p, 130, 10) << endl;cin.get();return 0;}
運行


這個樣本顯示了,若是帶參數的,參數跟在類對象或類指標後面即可。

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,綁定類函數成員,返回可調用對象。

在bind函數綁定中,已經有了詳細介紹。




本專欄目錄

  • C++拾遺目錄

所有內容的目錄

  • CCPP Blog 目錄

C++拾遺--類成員指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.