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. JAVA常见算法题(二十九)

    package com.forezp.util; import java.util.Scanner; /** * 判断输入的5个字符串的最大长度,并输出 * * * @author Administr ...

  2. 对自助提卡系统EDLM的一次代码审计

    前言 并非有意愿要审计该站,前面的走的黑盒没有过于精彩部分就不在贴上了,对于此系统站你们懂的,多说无益,这套程序是开源的,像这种自助提卡系统相信大家已经不在陌生了,很多违法网站通过这种平台方式提卡密的 ...

  3. time_t和SYSTEMTIME之间的相互转换 【转】

    time_t和SYSTEMTIME之间的相互转换 #include <ctime> /* **time_t转SYSTEMTIME */ SYSTEMTIME TimetToSystemTi ...

  4. 3D游戏图形技术解析(7)——视差映射贴图(Parallax Mapping)【转】

    http://www.cnblogs.com/taotaobujue/articles/2781371.html 视差映射贴图(Parallax Mapping) ● 传统纹理贴图的弊端 纹理贴图大家 ...

  5. Node.js abaike图片批量下载Node.js爬虫1.01版

    //====================================================== // abaike图片批量下载Node.js爬虫1.01 // 1.01 修正了输出目 ...

  6. Java中内存泄露及垃圾回收机制

    转自:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 写的相当不错滴...................... 摘  要 Java语言中,内 ...

  7. c语言指针详解 经典

    指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序 ...

  8. 正则表达式匹配a标签或div标签

    这里以a标签为例 a标签的href var a='<P><A href=\'~abc/ccg/ab.jpg\' width="3">文字</A> ...

  9. ASP.NET MVC & Web API Brief Introduction

    Pure Web Service(ASMX): Starting back in 2002 with the original release of .NET, a developer could f ...

  10. Asp.Net 之 二维码生成

    首先,引用 ThoughtWorks.QRCode.dll . 简单二维码生成及解码代码: //生成二维码方法一 private void CreateCode_Simple(string nr) { ...