C++ 指向类成员的指针

 更新时间:2020年03月20日 08:52:21   作者:AnnieKim  
指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员)

前面曾写过一篇恼人的函数指针(一),总结了普通函数指针的声明、定义以及调用,还有函数指针数组,函数指针用作返回值等。但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是指向类成员的指针,这里将做相应补充(相关代码测试环境为vs 2010)。

指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍:

一、指向类的普通成员的指针(非静态)

1、指向类成员函数的指针

简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。总结一下,比较以下几点:

a)参数类型和个数

b)返回值类型

c)所属的类类型(特别之处)

究其原因,是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(我们知道,所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。

明白了这点,接下来就简单了。

声明:与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可,格式为:

typedef 返回值 (类名::*指针类型名)(参数列表);

赋值:只需要用类的成员函数地址赋值即可,格式为:

指针类型名  指针名 = &类名::成员函数名;

注意:这里的这个&符号是比较重要的:不加&,编译器会认为是在这里调用成员函数,所以需要给出参数列表,否则会报错;加了&,才认为是要获取函数指针。这是C++专门做了区别对待。

调用:调用方法也很简单,针对调用的对象是对象还是指针,分别用.*和->*进行调用,格式为:

(类对象.*指针名)(参数列表);

(类指针->*指针名)(参数列表);

注意:这里的前面一对括号是很重要的,因为()的优先级高于成员操作符指针的优先级。

下面举个简单的例子就一目了然了:

class A;
typedef void (A::*NONSTATICFUNCPTR)(int);  //typedef

class A
{
public:
  void NonStaticFunc(int arg) 
  {
     nonStaticMember = arg; 
     cout<<nonStaticMember<<endl;
   }
 private:
   int  nonStaticMember;
 };
 
 int main()
 {
   NONSTATICFUNCPTR funcPtr= &A::NonStaticFunc;
 
   A a;
   (a.*funcPtr)(10);    //通过对象调用
 
   A *aPtr = new A;
   (aPtr->*funcPtr)(10);  //通过指针调用
 
   return 0;
 }

2、指向类数据成员的指针

成员函数搞懂了,数据成员也就easy了,只要判断以下两点是否一致即可:

a)数据成员类型

b)所属的类类型

另外,声明、赋值还有调用方法等这些是和前面类似的,再举个例子吧:

 class A;
 typedef int (A::*NONSTATICDATAPTR);    //typedef
 
 class A
 {
 public:
   A(int arg):nonStaticMember(arg){}
   int  nonStaticMember;
 };
 
 int main()
 {
   NONSTATICDATAPTR dataPtr= &A::nonStaticMember;
   
   A a(10);
   cout<<a.*dataPtr;    //通过对象引用
 
   A *aPtr = new A(100);
   cout<<aPtr->*dataPtr;  //通过指针引用
 
   return 0;
 }

运行结果,当然是各自输出10和100啦。

二、指向类的静态成员的指针

类的静态成员和普通成员的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。

所以,指向类的静态成员的指针就是普通的指针。

看下面的例子就明白了:

 typedef const int *STATICDATAPTR;  
 typedef int (*STATICFUNCPTR)();    //跟普通函数指针是一样的
 
 class A
 {
 public:
   static int StaticFunc() { return staticMember; };
   static const int staticMember = 10;
 };
 
 int main()
 {
   STATICDATAPTR dataPtr = &A::staticMember;
   STATICFUNCPTR funcPtr = &A::StaticFunc;
   
   cout<<*dataPtr;      //直接解引用
   cout<<(*funcPtr)();  
 
   return 0;
 }

最后注明一下,显然的,要使用(&类名::成员名)获取指向成员的指针,首先这个成员必须是对外可见的哦,即public的,不然是没有权限获取的^^。

写到此,简单总结一下就是:

1)静态的和普通的函数指针没啥区别;

2)非静态的加一个类局限一下即可。

不知道以后还会不会有函数指针相关的内容,先到此完结吧。

有错误欢迎指正,我会及时修改^^。

(完)

以上就是C++ 指向类成员的指针的详细内容,更多关于C++指针的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现简单推箱子小游戏

    C++实现简单推箱子小游戏

    这篇文章主要为大家详细介绍了C++实现简单推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C++标准模板库map的常用操作

    C++标准模板库map的常用操作

    今天小编就为大家分享一篇关于C++标准模板库map的常用操作,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++如何实现广义表详解

    C++如何实现广义表详解

    广义表是非线性结构,其定义是递归的。那么下面跟着小编一起看看如何用C++实现广义表,有需要的可以参考借鉴。
    2016-08-08
  • C语言使用回溯法解旅行售货员问题与图的m着色问题

    C语言使用回溯法解旅行售货员问题与图的m着色问题

    回溯法即是在按条件搜索走不通的情况下退回再选择其他路线的方法,这里我们来看C语言使用回溯法解旅行售货员问题与图的m着色问题的方法示例:
    2016-07-07
  • C++的深浅拷贝和写时拷贝你了解吗

    C++的深浅拷贝和写时拷贝你了解吗

    这篇文章主要为大家详细介绍了C++的深浅拷贝和写时拷贝,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言 指针综合解析

    C语言 指针综合解析

    指针可以表示一个变更的地址,在计算机程序中,通常表示内存地址,存储数据的地址,下面这篇文章主要给大家综合的介绍了关于C语言指针的本质与用法
    2021-11-11
  • 你真的知道C++对象大小吗?

    你真的知道C++对象大小吗?

    这篇文章主要给大家介绍了关于C++对象大小的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C++成员解除引用运算符的示例详解

    C++成员解除引用运算符的示例详解

    这篇文章主要介绍了C++成员解除引用运算符,本例子在编译期间给指针赋值,在更为复杂的类中,可以使用指向数据成员和方法的成员指针,需要的朋友可以参考下
    2022-01-01
  • C++设计与实现ORM系统实例详解

    C++设计与实现ORM系统实例详解

    这篇文章主要为大家介绍了C++设计与实现ORM系统实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Qt实现拖动单个控件移动的示例代码

    Qt实现拖动单个控件移动的示例代码

    做惯了静态图,今天来搞一搞动态图吧!本文将利用Qt实现拖动单个控件移动效果,文中的示例代码讲解详细,感兴趣的可以动手尝试一下
    2022-06-06

最新评论