C++获取类的成员函数的函数指针详解及实例代码

C++获取类的成员函数的函数指针详解

用一个实际代码来说明。

class A
{
public:
  staticvoid staticmember(){cout<<"static"<<endl;}  //static member
  void nonstatic(){cout<<"nonstatic"<<endl;}     //nonstatic member
  virtualvoid virtualmember(){cout<<"virtual"<<endl;};//virtual member
};
int main()
{
  A a;
  //static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符
  void(*ptrstatic)()=&A::staticmember;
  //nonstatic成员函数 取得的是该函数在内存中的实际地址
  void(A::*ptrnonstatic)()=&A::nonstatic;
  //虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果
  void(A::*ptrvirtual)()=&A::virtualmember;
  //函数指针的使用方式
  ptrstatic();
  (a.*ptrnonstatic)();
  (a.*ptrvirtual)();
}

可以参考《C++ Primer(3rd)》第532页13.6指向类成员的指针一节~

 1.一个指向外部函数的指针声明为:

void(*pf)(char*,constchar*);
void strcpy(char* dest,constchar* source);
pf=strcpy;

2.一个指向类A成员函数的指针声明为:

void(A::*pmf)(char*,constchar*);

声明的解释是:pmf是一个指向A成员函数的指针,返回无类型值,函数带有二个参数,参数的类型分别是char * 和 const char *。除了在星号前增加A:: ,与声明外部函数指针的方法一样。

3.给成员指针赋值的方法是将函数名通过指针符号&赋予指针名。

如下所示:

class A
{
  public:
   void strcpy(char*,constchar*);
   void strcat(char*,constchar*);
};
pmf =&A::strcpy;

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++ 基类指针和子类指针相互赋值的实现方法

    首先,给出基类animal和子类fish //============================================================== // animal.h // // author : zwq // describe: 非虚函数情况下,将子类指针赋给积累指针,验证最终调用 // 基类函数还是子类函数. //============================================================== #ifndef ANIMA

  • 实例解析C++中类的成员函数指针

    C语言的指针相当的灵活方便,但也相当容易出错.许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下.但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序. 然而C++的指针却常常给我一种束手束脚的感觉.C++比C语言有更严格的静态类型,更加强调类型安全,强调编译时检查.因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换.而且这些指针的声明格式都不一样:

  • C++指向类成员函数的指针详细解析

    首先 函数指针是指向一组同类型的函数的指针:而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数.前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的. 函数指针实例: 复制代码 代码如下: typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型int func(int x,int y){ printf("func:x=%d,y=%

  • C++中指针的数据类型和运算相关知识小结

    C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i,p-=i等. C++规定,一个指针变量加/减一个整数是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加或相减.如p+i代表这样的地址计算:p+i*d,d为p所指向的变量单元所占用的字节数.这样才能保证p+i指向p下面的第i个元素. 2) 指针变量赋值 将一个变量地址赋给一个指

  • 浅谈C++ 基类指针和子类指针的相互赋值

    首先,给出基类animal和子类fish //============================================================== // animal.h // // author : zwq // describe: 非虚函数情况下,将子类指针赋给积累指针,验证最终调用 // 基类函数还是子类函数. //============================================================== #ifndef ANIMA

  • C/C++静态类和this指针详解及实例代码

     C/C++静态类和this指针详解 1.静态类 C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问. class CBook{ public: static double price;//需要通过类外来进行初始化 } int main(void){ CBook book; book.price;//通过对象来访问 CBook::price//通过类名来访问 return 0; } 静态成员变量 对应静态成员有以下几点需要注意: (1)静态数据成员可以是当前类的类型,而其他数据成员

  • C++带有指针成员的类处理方式详解

    在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存.但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存.在<<c++ primer>> 中写到,如果一个类需要我们自己写析构函数,那么这个类,也会需要我们自己写拷贝构造函数和拷贝赋值函数. 析构函数: 我们这里定义一个类HasPtr,这个类中包含一个int 类型的指针.然后定义一个析构函数,这个函数打印一句话. HasPtr.h 类的头文件 #pragma once #ifndef

  • MyBatis获取数据库自生成的主键Id详解及实例代码

    MyBatis获取数据库自生成的主键Id详解及实例代码 在使用MySQL数据库时我们一般使用数据库的自增主键自动产生主键.如果在插入主表时,我们需要同时插入从表的数据,这时我们通常需要知道主表插入时自动产生的主键Id值. 下面介绍使用MyBatis进行插入时,如何同时获取数据库自生成的主键: 1.XML配置文件 <insert id="insert" parameterType="Person" useGeneratedKeys="true"

  • C++获取类的成员函数的函数指针详解及实例代码

    C++获取类的成员函数的函数指针详解 用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} //static member void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member virtualvoid virtualmember(){cout<

  • C++ 静态成员的类内初始化详解及实例代码

    C++ 静态成员的类内初始化详解及实例代码 一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #include<iostream> #include<vector> using namespace std; class Example{ public: static double rate = 6.5; static const int vecSi

  • C++静态成员函数和this指针详解

    目录 静态成员 1.静态成员变量 2.静态成员函数 成员变量和成员函数分开存储 this 指针 空指针访问成员函数 总结 静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 1.静态成员变量 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 示例: #include<iostream> using namespace std; class Person { public: static int m; // 所有对象共享同一份数据 }

  • C++函数重载详解及实例代码

    C++函数的重载 定义 在同一个作用域中,函数名相同,函数的参数列表不同的函数之间构成重载关系,在不同作用域中的同名函数遵循标识符隐藏的原则 ATTENTION:重载与函数的返回值类型无关,因为声明一个函数不需要返回类型,所以无法用来区分哪个函数 常函数和普通成员函数之间构成重载,重载时常对象调用常成员函数,一般对象调用一般成员函数 class A{ - public: void getVal()const{-} void getVal(){-} }; int main(){ const A a

  • C++/java 继承类的多态详解及实例代码

    C++/java 继承类的多态详解 学过C++和Java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装.继承.多态,所有今天我们就来简单了解一下C++和Java在多态这方面的不同. 首先我们各看一个案例. C++ //测试继承与多态 class Animal { public: char name[128]; char behavior[128]; void outPut() { cout << "Animal" << endl

  • java 嵌套类的详解及实例代码

    java 嵌套类 到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package)的级别上.Java允许类的嵌套定义. 这里将讲解如何在一个类中嵌套定义另一个类. 内部类 Java允许我们在类的内部定义一个类.如果这个类是没有static修饰符,那么这样一个嵌套在内部的类称为内部类(inner class). 内部类被认为是外部对象的一个成员.在定义内部类时,我们同样有访问权限控制(public, private, protected). 在使用内部类时,我们要先创建外部对象.

  • Java Process类的详解及实例代码

    Java Process类的详解 前言: 今天用了下Java.lang.Process类,只是初步的学习,并没有深入实践,因为感觉它的用途并不是很大,偶尔才可能用上,如果要经常使用它的人可以自行参考JDk文档. 对Process类的简要说明: Process类是一个抽象类,方法都是抽象的,它封装了一个进程,也就是一个可执行的程序  该类提供进程的输入.执行输出到进程.等待进程的完成和检查进程的退出状态及销毁进程的方法 ProcessBuilder.start()和Runtime.exec方法创建

  • java LinkedList类详解及实例代码

    java  LinkedList类详解 LinkedList的特有功能 A:添加功能 public void addFirst(Object e); public void addLast(Object e); B:特有功能 public Object getFirst(); public Object getLast(); C:删除功能 public Object removeFirst(); public Object removeLast(); 实例代码: import java.util

  • java  LinkedList类详解及实例代码

    java  LinkedList类详解 LinkedList的特有功能 A:添加功能 public void addFirst(Object e); public void addLast(Object e); B:特有功能 public Object getFirst(); public Object getLast(); C:删除功能 public Object removeFirst(); public Object removeLast(); 实例代码: import java.util

随机推荐