重學C++(2)——指向類成員的指標(轉自:http://www.wangchao.net.cn/bbsdetail_73812.html)

來源:互聯網
上載者:User
class A  {   int _val;   int val();  };  int (A::*p_val) = &A::_val;  int ( A::*p_func )() = &A::val;

指向類成員的指標,印象中似乎很少用到,重新學習C++的過程中,才發現自己是忽視了一個很重要的東東,以前我一直認為類的成員函數不能作為回呼函數,所以很多C程式都始終無法移植到C++上來,現在才知道,這是對指向類成員的指標不瞭解的緣故。
  1、指向非靜態成員的指標
  其實指向非靜態類成員的指標很容易,它們與普通指標唯一的區別是,他們受類的限制。如下:
  
  看到了嗎,是的,和普通的指標的區別是,指向類成員的指標必須把類也一併帶上,上面的例子中就是要把A::這個限定符一起戴上,然後?用法和普通指標一樣的就是了。
  2、指向靜態成員的指標
  指向靜態成員的指標,聲明的方式和普通指標完全一樣,只是賦值的時候,還得加上類的限定符。為什麼這樣?我想可以這樣來理解,對於非靜態成員,其存在取決於類,類消亡的時候,非靜態成員隨之消亡,所以,其聲明必須與類的限定符綁在一起,而靜態成員對於類而言並無依附關係,所以,不需要類的限定符。如下:
  

class A  {   static int _val;   static int val();  };  int *p_val = &A::_val;  int (*p_func) = &A::val;

  3、好處:
  一個好處是,通過指向成員的函數指標,可以很輕鬆的調用各個成員函數了,另一個好處是,對於靜態成員函數,可以成為C裡的回呼函數啦。
  下面是一個例子,加深一下理解:
  

#include <iostream>  #include <string>    using namespace std;    typedef void (*funchandler)();    void register_func(funchandler f)  {   cout << "register_func" << endl;   (*f)();  }    class A  {  public:   A() : _val( 0 ) { cout << "create A..." << endl; }   void test() { cout << "test..." << endl; }   void test1() { cout << "test1..." << endl; }   void test2() { cout << "test2..." << endl; }   int val() { return _val; }   static void test3() { cout << "test3..." << endl; }   int _val;  private:   };        int main()  {   A a;   int ( A::*p_val ) = 0;   p_val = &A::_val;   cout << "a.*p_val: " << a.*p_val << endl;      void (A::*p_func)();   p_func = &A::test;      a.test();   (a.*p_func)();      p_func = &A::test1;   ( a.*p_func )();   p_func = &A::test2;   ( a.*p_func )();      void (* pp_func)();   pp_func = &A::test3;   (*pp_func)();      register_func( pp_func );   return 0;     }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.