C++成员函数指针

C++成员函数指针

这里只是简单介绍成员函数指针的用法,部分内容参考如下链接,深层次介绍也请参见如下链接(应该是原文,可惜没有找到文章的原稿,链接中图片显示不正常):

http://blog.csdn.net/xlie/article/details/3031966#_Toc133650388

C++成员函数分为静态成员函数和普通成员函数,其中普通成员函数的实现中隐式包含了this指针作为其第一个参数,所以导致两者函数指针使用的差异,静态成员函数指针与普通的外部函数指针使用基本一致,但普通成员函数指针类型的定义要包含类名的信息:

#include <iostream>  
  
class Test  
{  
public:  
    Test(int a, int b): a(a), b(b)  
    {}  
    static void print (Test & test)  
    {  
        std::cout << test.a << std::endl;  
        std::cout << test.b << std::endl;  
    }  
    void output ()  
    {  
        std::cout << this->a << std::endl;  
        std::cout << this->b << std::endl;  
    }  
private:  
    int a;  
    int b;  
};  
  
int main()  
{  
    Test test(1, 2);  
    typedef void(Test::* MemFun)();//普通成员函数的函数指针定义  
    MemFun output = &Test::output;  
    (test.*output)(); //等同于:Test * ptest = &test; (ptest->*output)(); 
    typedef void(* StaticMemFun)(Test&);//静态成员函数的函数指针定义  
    StaticMemFun print = &Test::print;  
    print(test);  
}  

注意上述代码中,普通成员函数函数指针类型*前要加"类名::",静态成员函数无此限制。

注意获取一个成员函数指针的语法要求很严格:

1、不能使用括号:例如&(Test::output)错误;

2、必须有限定符:例如&output不对。即使在类Test的作用域内也不行,必须加上限定符;

3、必须使用取地址符号:例如直接写Test::output不行(虽然普通函数指针可以这样)。所以,必须要这样写:&ClassName::foo。


注意这里成员函数指针已经开始显示它“异类”的天性了。上面代码中注释A和B处两个表达式,产生了一个在C++里面没有类型的“东西”(这是C++语言里面唯一的例外,其它任何东西都是有类型的),这就是.*和->*运算符运算产生的东西:

(test.*output)

(ptest->*output)

这两个运算符求值生成的“东西”我们只知道可以把它拿来当函数调用一样使唤,别的什么也不能干,甚至都不能把它存在某个地方。就因为这个原因,Andrei Alexandrescu 在他那本著名的《Modern c++ design》里面就说,成员函数指针和这两个操作符号是“curiously half-baked concept in c++”。(5.9节)

 

C++里面引入了“引用”(reference)的概念,可是却不存在“成员函数的引用”,这也是一个特殊的地方。(当然,我们可以使用“成员函数指针”的引用,呵呵)。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值