重學(xué)C++(2)——指向類成員的指針
指向類成員的指針,印象中似乎很少用到,重新學(xué)習(xí)C++的過(guò)程中,才發(fā)現(xiàn)自己是忽視了一個(gè)很重要的東東,以前我一直認(rèn)為類的成員函數(shù)不能作為回調(diào)函數(shù),所以很多C程序都始終無(wú)法移植到C++上來(lái),現(xiàn)在才知道,這是對(duì)指向類成員的指針不了解的緣故。1、指向非靜態(tài)成員的指針
其實(shí)指向非靜態(tài)的類成員的指針很容易,它們與普通指針唯一的區(qū)別是,他們受類的限制。如下:
class A
{
int _val;
int val();
};
int (A::*p_val) = &A::_val;
int ( A::*p_func )() = &A::val;
看到了嗎,是的,和普通的指針的區(qū)別是,指向類成員的指針必須把類也一并帶上,上面的例子中就是要把A::這個(gè)限定符一起戴上,然后?用法和普通指針一樣的就是了。
2、指向靜態(tài)成員的指針
指向靜態(tài)成員的指針,聲明的方式和普通指針完全一樣,只是賦值的時(shí)候,還得加上類的限定符。為什么這樣?我想可以這樣來(lái)理解,對(duì)于非靜態(tài)成員,其存在取決于類,類消亡的時(shí)候,非靜態(tài)成員隨之消亡,所以,其聲明必須與類的限定符綁在一起,而靜態(tài)成員對(duì)于類而言并無(wú)依附關(guān)系,所以,不需要類的限定符。如下:
class A
{
static int _val;
static int val();
};
int *p_val = &A::_val;
int (*p_func) = &A::val;
3、好處:
一個(gè)好處是,通過(guò)指向成員的函數(shù)指針,可以很輕松的調(diào)用各個(gè)成員函數(shù)了,另一個(gè)好處是,對(duì)于靜態(tài)成員函數(shù),可以成為C里的回調(diào)函數(shù)啦。
下面是一個(gè)例子,加深一下理解:
#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;
} |
轉(zhuǎn)自http://blog.csdn.net/kunp/archive/2005/10/17/505614.aspx
posted on 2005-11-16 12:44 春雷的博客 閱讀(795) 評(píng)論(0) 編輯 收藏