codefans

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          程序設計鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          重學C++(2)——指向類成員的指針

          指向類成員的指針,印象中似乎很少用到,重新學習C++的過程中,才發現自己是忽視了一個很重要的東東,以前我一直認為類的成員函數不能作為回調函數,所以很多C程序都始終無法移植到C++上來,現在才知道,這是對指向類成員的指針不了解的緣故。

          1、指向非靜態成員的指針

          其實指向非靜態的類成員的指針很容易,它們與普通指針唯一的區別是,他們受類的限制。如下:

          class A
          {
              int _val;
              int val();
          };

          int (A::*p_val) = &A::_val;
          int ( A::*p_func )() = &A::val;

          看到了嗎,是的,和普通的指針的區別是,指向類成員的指針必須把類也一并帶上,上面的例子中就是要把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;

             

          }


          轉自http://blog.csdn.net/kunp/archive/2005/10/17/505614.aspx

          posted on 2005-11-16 12:44 春雷的博客 閱讀(795) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 封丘县| 雅江县| 佛山市| 扎鲁特旗| 镇宁| 和平县| 云龙县| 洮南市| 西畴县| 新乐市| 泗水县| 开江县| 浪卡子县| 余姚市| 岱山县| 长沙市| 改则县| 西充县| 泌阳县| 湖北省| 文水县| 四川省| 湘潭市| 财经| 西昌市| 沾化县| 湘西| 余江县| 海晏县| 铜山县| 南江县| 庆元县| 惠州市| 庄浪县| 虎林市| 黔江区| 南江县| 海口市| 大关县| 江油市| 萨嘎县|