zoukankan      html  css  js  c++  java
  • 类的成员函数指针的使用

    类的成员函数指针普通的函数指针 在C++中是完全两个不同的东西

    今天偶然需要找了点资料才发现这个问题,写一个简单的例子 

    #include <iostream>

    using namespace std;

    class test_class{
    public:
        
    void print(uint32_t num);
    };

    void test_class::print(uint32_t num){
        cout
    <<num<<endl;
    }


    void print(uint32_t num){
        cout
    <<num<<endl;
    }

    typedef 
    void (test_class::*funptr)(uint32_t);

    main()
    {
        test_class a;
        funptr ptr
    =&test_class::print;
        (a.
    *ptr)(3);

    } 

    声明不一样, 普通情况使用(*fun_ptr)就行,这种情况要使用:

    (类名::*funptr)

    typedef void (test_class::*funptr)(uint32_t);

    赋值的时候要注意,=右边是类名::函数名,而不是对象名::函数名 

    funptr ptr=&test_class::print; 

    调用的时候要注意,这个时候前面就要加上对象了,在这个例子里面可以用a.*,也可以用a-> 

    (a.*ptr)(3); 

     参考了:http://blog.csdn.net/eroswang/article/details/4153356

    贴出重要部分:

    1。成员函数指针并不是普通的函数指针。

    2。编译器提供了几个新的操作符来支持成员函数指针操作:

    1) 操作符"::*"用来声明一个类成员函数指针,例如:
        typedef void (Base::*PVVBASEMEMFUNC)(void);        //Base is a class
    2) 
    操作符"->*"用来通过对象指针调用类成员函数指针,例如:
        //pBase is a Base pointer and well initialized
        //pVIBaseMemFunc is a member function pointer and well initialized

        (pBase->*pVIBaseMemFunc)();

    3) 操作符".*"用来通过对象调用类成员函数指针,例如:
        
    //baseObj is a Base object
        //pVIBaseMemFunc is a member function pointer and well initialized

        (baseObj.*pVIBaseMemFunc)(); 


    3
    。成员函数指针是强类型的。

        typedef void (Base::*PVVBASEMEMFUNC)(void);
        typedef 
    void (Derived::*PVVDERIVEMEMFUNC)(void);
    PVVBASEMEMFUNC
    PVVDERIVEMEMFUNC是两个不同类型的成员函数指针类型。


    4
    。由于成员函数指针并不是真真意义上的指针,所以成员函数指针的转化就受限制。具体的转化细节依赖于不同的编译器,甚至是同一个编译器的不同版本。不过,处于同一个继承链中的不同类之间override的不同函数和虚函数还是可以转化的。

        void* pVoid = reinterpret_cast<void*>(pVIBaseMemFunc);            //error
        int*  pInt  = reinterpret_cast<int*>(pVIBaseMemFunc);             //error
      pVIDeriveMemFunc = static_cast<PVIDERIVEMEMFUNC>(pVIBaseMemFunc);   //OK

     
  • 相关阅读:
    vi/vim 跳转到指定行
    svn如何过滤常见的bin/obj/package/log等文件夹的文件
    WIN10:你不能访问此共享文件夹,解决方法
    WinServer2019的IIS上无法安装framework3.5的问题
    浏览器播放实时视频,通过rtsp码流播放
    easyui comboxtree 如何获得选中值的其它属性
    iphone上传拍照图片时图片会旋转90度,从相册选择就不会,安卓手机也不会,怎么解决?
    如何快速清空微信浏览器中的缓存
    js种 new Date(str)的时候,在google下正常,ie11下异常的解决办法
    layer第二个按钮点击后关闭的解决方法
  • 原文地址:https://www.cnblogs.com/welkinwalker/p/2149690.html
Copyright © 2011-2022 走看看