1、指向类的数据成员的指针:

声明格式如下:

<类型说明符> <类名>::* <指针变量名>;

2、指向类的成员函数的指针:

声明格式如下:
   <类型说明符> (<类名>::*<指针名>)(<参数表>);
如:

class A
{
private:
    int a;
public:
    int c;
public:
    A(int i)
    {
        a = i;
    };

    int Fun(int b)
    {
        return ((a * c) + b);
    };
};

定义一个指向类A的数据成员c的指针,其格式如下:

int A::* pc = &(A::c);

定义一个指向类A的成员函数Fun()的指针,其格式如下:

int (A::*pFun)(int) = A::fun;
或
int A::*pFun(int);
pFun = A::fun;

由于类不是运行时存在的对象,所以在使用这类指针的时候,要定义类的一个对象,然后通过这个对象来访问这类指针所指向的成员;
如: 

A a;
a.*pc = ;    //为对象a的数据成员c赋值8;
A* pa;
pa = &a;
pa->*pc = ;  //通过指向对象的指针来为指向对象成员的指针所指向的数据成员赋值;

其中,运算符".*"和"->*"都是通过指向类成员的指针来操作对象成员的运算符;

3.指向普通函数的指针的定义格式:

<类型说明符> (*<指向函数的指针名>)(<参数表>);

赋值:

<指向函数的指针名> = <函数名>;

调用:

(*<指向函数的指针名>)(<实参表>);

例如:

class B
{
    private:
        int a;
    public:
        int c;
    public:
        A(int i) { a = i;};
        int Fun(int b) { return ((a * c) + b); };
};
int main(int argc, char** argv)
{
    B x()
    int B::* pc = NULL;     //声明指向类数据成员的指针pc;
    pc = &(A::c);           //为指向类数据成员的指针pc赋值;
    x.*pc = ;              //通过指向类数据成员的指针pc为对象的成员赋值;

    int (B::*pFun)(int);    //声明指向类成员函数的指针pFun;
    pFun = A::Fun;          //为指向类成员函数的指针pFun赋值为A::Fun;

    A* px = &x;             //声明指向类的对象x的指针px;
    cout << (px->*pFun)(); //通过指向对象x的指针px来访问指向对象x的成员函数的指针pFun,并调用指向对象的成员函数指针所指向的成员函数;
    ;
}

-------------------------------------------------------------------------------------------------

自理解指向类数据成员的指针的结合性:

<类型说明符> (<类名>::*) <指针名> = &(<类名>::<数据成员名>)
int (A::*) pc = &(A::c);

(<类型说明符> <类名>::)* <指针名> = &(<类名>::<数据成员名>)
(int A::)* pc = &(A::c);

(<类型说明符> <类名>::) (*<指针名>) = &(<类名>::<数据成员名>)
(int A::) (*pc) = &(A::c);
可以把(*pc)作为整体,看作是对类A的数据成员c的引用,或者是 (*pc)<==>c;
即: (*<指针名>) <==> <数据成员名>

所以, A::(*pc) <==> A::c;

自理解指向类成员函数的指针的结合性:

<类型说明符> (<类名>::*<指针名>)(<参数表>) = <类名>::<成员函数名>;
int (A::*pFun)(int) = A::Fun;

<类型说明符> <类名>::*<指针名>(<参数表>) = <类名>::<成员函数名>;
int A::*pFun(int) = A::Fun;

<类型说明符> <类名>::(*<指针名>)(<参数表>) = <类名>::<成员函数名>;
int A::(*pFun)(int) = A::Fun;
可以把(*pFun)作为整体,看作是类A的成员函数名Fun;
即: (*pFun) <==> Fun;
所以,A::(*pFun) <==> A::Fun;

C++类成员指针(指向类成员的指针)的更多相关文章

  1. c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别

    一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...

  2. 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)

    假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...

  3. <六>指向类成员的指针

    指向类成员(成员变量和成员方法)的指针 1:定义一个指针指向类的普通成员变量 示例代码1 点击查看代码 class Test2{ public: int ma; static int mb; void ...

  4. c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用

    c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用 c++不会像上图那样为每一个对象的成员变量和成员函数开辟内存空间, 而是像下图那样,只为每一个对象的成员变量开辟空间.成员 ...

  5. c++ 指向类成员函数的函数指针

    // ConsoleApplication34.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  6. C++ 指向类成员函数指针的用法(转自维基百科)

    类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...

  7. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  8. C++学习之普通函数指针与成员函数指针

    函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...

  9. c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)

    看下面例子: #include "stdafx.h" #include <iostream> class A {  //父类 public: void  f()   / ...

随机推荐

  1. 【LaTeX】E喵的LaTeX新手入门教程(2)基础排版

    换了块硬盘折腾了好久..联想的驱动真坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇文档框架嗯昨天我们已经编写了一个最基本的文档,其内容是这样的:\documentclass{ar ...

  2. Chrome 控制台新玩法-向输出到console的文字加样式

    Chrome 控制台新玩法-向输出到console的文字加样式 有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字 ...

  3. xpages开发的bom管理系统

    domino对流程设计是方便的.假设制作复杂逻辑的应用就难了.可是还是能够实现的,曾经的一个bom管理系统.刚開始想使用java的ssh来做,后来为了统一平台.还是使用domino来做,经过长时间的研 ...

  4. 流畅的python第四章文本和字节序列学习记录

    字符问题 把码位转化成字节序列的过程是编码,把字节序列转化成码位的过程是解码 把unicode字符串当成人类可读的文本,码位当成机器可读的, 将字节序列编程人类可读是解码,把字符串编码成字节序列是编码 ...

  5. iis服务器配置 url rewrite 模块

    从网上找了一下,原来微软IIS官方网站给IIS7及以后续版本提供了个URL重写组件. 下载地址:https://www.iis.net/downloads/microsoft/url-rewrite ...

  6. Java笔记11:JSP连接Oracle数据库

    1 建立Web项目 在D:\tomcat\webapps\中建立basicSyntax项目,在该项目中添加WEB-INF,WEB-INF\classes\,WEB-INF\lib\和WEB-INF\w ...

  7. 十个书写Node.js REST API的最佳实践(下)

    收录待用,修改转载已取得腾讯云授权 5. 对你的Node.js REST API进行黑盒测试 测试你的REST API最好的方法之一就是把它们当成黑盒对待. 黑盒测试是一种测试方法,通过这种方法无需知 ...

  8. java匿名内部类之RocketMQ中的应用

    匿名内部类在spring中没怎么见用,在RocketMQ中有大量的应用. 确实可以提高开发效率.这可能代表两种写代码的态度吧. 匿名内部类简单来说就是直接在函数中实现接口方法,不需要声明一个接口实现类 ...

  9. Notepad++的使用

    \t 制表符.  \n 新行.  . 匹配任意字符.  | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "ab" 或者 "bc&quo ...

  10. 解决oracle和plsql乱码问题

    oracle 10g装上后,建了个表写入中文数据,发现通过工具DbVisualizer 6.5 写入/读取中文都正常,就sqlplus和PL/SQL Developer不正常. 初步怀疑是DbVisu ...