C++一般(普通)函数指针、类成员函数指针,用法区别,以及 强制转换

    技术2023-10-11  103

    直接上代码:

    #include <iostream> class CClass { public: //类 函数指针 void (*pClass_Func_Pointer)(int a); //类 静态函数 static void class_Static_Func(int a) { cout<<a<<"访问:类 静态成员函数"<<endl; } //类 函数 void class_Func(int a) { cout<<a<<"访问:类 成员函数"<<endl; } }; //函数指针 void (*pFunc_Pointer)(int a); //类 函数指针(外部) void (CClass::*pClass_Func_Pointer_Outside)(int a); //函数 void func(int a) { cout<<a<<"访问:函数"<<endl; } int main(int argc, const char *argv[]) { CClass cInst; //1、函数指针 = 函数 pFunc_Pointer = func; (*pFunc_Pointer)(1); //2、函数指针 = 类静态函数 pFunc_Pointer=&CClass::class_Static_Func; (*pFunc_Pointer)(2); //3、函数指针 = &类域::类 函数 //编译器报错,不可以这么使用 //pFunc_Pointer=&CClass::class_Fun; //编译器报错,不可以这么使用 //4、类 函数指针(外部) = 函数 //编译器报错,不可以这么使用 //pClass_Func_Pointer_Outside = &func; //编译器报错,不可以这么使用 //5、类 函数指针(外部) = &类域::类 静态函数 //编译器报错,不可以这么使用 //pClass_Func_Pointer_Outside = &CClass::class_Static_Func; //编译器报错,不可以这么使用 //6、类 函数指针(外部) = &类域::类 函数 pClass_Func_Pointer_Outside = &CClass::class_Func; //初始化的时候必须带有 指定域 //pClass_Func_Pointer_Outside(6); //编译器报错,不可以这么使用 //cInst.pClass_Func_Pointer_Outside(6); //编译器报错,不可以这么使用 //cInst.*pClass_Func_Pointer_Outside(6); //编译器报错,不可以这么使用 //cInst.(*pClass_Func_Pointer_Outside)(6); //编译器报错,不可以这么使用 (cInst.*pClass_Func_Pointer_Outside)(6); //正常运行 //7、类 函数指针 = 函数 cInst.pClass_Func_Pointer = &func; cInst.pClass_Func_Pointer(7); //8、类 函数指针 = &类域::类 静态函数 cInst.pClass_Func_Pointer = &CClass::class_Static_Func; cInst.pClass_Func_Pointer(8); //9、类 函数指针 = &类域::类 函数 //编译器报错,不可以这么使用 //cInst.pClass_Func_Pointer = &CClass::class_Func; //编译器报错,不可以这么使用 cout<<endl<<endl; system("pause"); return 0; }

    关于强制转换:

    class CClass { public: void func() { cout<<"func()"<<endl; }; }; typedef void (CClass::*pMemFnction)(); int main() { pMemFnction method = &CClass::func; //成员函数指针定义并初始化 CClass tt; (tt.*method)(); int method_ptr = *(int *)&method; //强制转换 pMemFnction m = *(pMemFnction *)&method_ptr; //强制转换, OK (tt.*m)(); return 0; }

    网上的一个例子:

    #include <iostream> class mc { public: mc() { //构造函数中数组初始化,必须指定域 maps[0] = &mc::On_WM_PAINT; maps[1] = &mc::On_WM_DESTORY; } typedef void (mc::*PCFUNC)();//类成员函数指针,必须指定域 void On_WM_PAINT() { cout << "ON_WM_PAINT" << endl; } void On_WM_DESTORY() { cout << "ON_WM_DESTORY" << endl; } PCFUNC maps[2];//类成员函数指针数组 void CClass() { (this->*maps[1])();//类内部调用 } }; void main() { mc myclass;//声明类实例 mc::PCFUNC pcfunc = myclass.maps[0];//声明一个类成员函数指针变量 (myclass.*pcfunc)();//调用第0个函数输出“ON_PAINT” myclass.CClass();//内部调用,输出“ON_DESTORY” system("pause"); }

    代码工程下载地址: https://download.csdn.net/download/maoyeahcom/12573408

    Processed: 0.027, SQL: 9