原文:https://blog.csdn.net/laojiu_/article/details/68946915

(原文有笔误)

1.

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
class A
{
public:A(int a=0,int b=0):a(a),b(b){}void print(){cout<<"a="<<a<<"  "<<"b="<<b<<endl;}
public:int a;int b;
};
typedef void (A::*pFun)(void);
int main(void)
{A ap;ap.print();//输出a和b的默认值int A::*aptr=&A::a;//aptr为A这个类中,a的成员指针int A::*bptr=&A::b;bptr为A这个类中,b的成员指针printf("aptr=%d,bptr=%d\n",aptr,bptr);//输出两个指针值ap.*bptr=5;//通过成员指针修改成员的值ap.print();return 0;
}

类成员变量指针,实际上并不是真正意义上的指针,即它并不是指向内存中某个地址,而是该成员变量与对象指针的偏移量。该偏移量只有附着在某个具体对象,才能指向对象成员变量的具体地址。

2.对于C++静态成员的指针,其值就是指向内存中数据区某个地址,就是真正意义上的指针,因为静态成员属于类范围,不属于某个对象。

成员函数指针

1.非静态函数指针

C++非静态成员函数的指针,其值就是指向一块内存地址。但是指针不能直接调用,它需要绑定到一个对象才能调用。

2.虚拟成员函数指针

虚拟成员函数指针的值表示该函数在虚函数表中,离表头的偏移量+1。通过反汇编代码知道当一个对象调用虚拟函数时,主要是通过

  1. 获取指向虚函数表指针的值。
  2. 指向虚函数表指针的值加上虚函数离表头的偏移量即为该函数的地址。 
    所以虚函数表示虚函数在虚函数表的偏移量+1,再绑定到一个对象,即可调用这个虚函数。

谈谈我对这些指针本质上的理解。

一个类,当它编译,运行,实例化一个对象时,在内存中总是可以找到该对象的所有成员变量和函数地址。

非静态成员通过对象指针+偏移量访问。 
虚函数可以通过对象指针加偏移量得到。 
静态成员,非静态函数,静态函数可以通过链接时获得。

所以:

非静态成员指针表示一个偏移量,因为通过对象可以访问到。 
虚函数指针表示虚函数地址在虚函数表中的偏移量。 
静态成员,非静态函数和静态函数不能通过对象指针直接访问到,所以这三个的指针类型必须是具体的函数地址。

C++成员变量指针和成员函数指针【The semantics of funcitons】相关推荐

  1. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

  2. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  3. 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用

    一.数组指针和指针数组 1.数组指针(行指针) 首先要知道数组指针是指向数组的指针.所以数组指针本质是个指针,只不过指向一个数组而已.格式为:T (*ptr)[]. 注意:"[]" ...

  4. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  5. delphi7存储过程传入数组_C++中的指针、数组指针与指针数组、函数指针与指针函数...

    本文从初学者的角度,深入浅出地详解什么是指针.如何使用指针.如何定义指针.如何定义数组指针和函数指针,并给出对应的实例演示:接着,区别了数组指针与指针数组.函数指针与指针函数:最后,对最常混淆的引用传 ...

  6. [转] 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则

    一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量.既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都 ...

  7. 【C语言】指针进阶 - 指针数组 数组指针 数组指针传参 函数指针 指向函数指针数组的指针

    目录 一.字符指针 一道题 二. 指针数组 解引用打印数组元素 &数组名 数组名 字符指针初始化 三.数组指针 取数组地址-放在数组指针里 类型 数组指针的使用 二维数组传参 判断 四.数组参 ...

  8. 函数指针 和 函数指针数组 和 函数指针数组

    //先看一些函数指针的例子(吸纳了网上兄弟的方法) #include <stdio.h> void MyFun(int x); //这个申明也可写成:void MyFun( int ); ...

  9. 指针难点——数组指针、指针数组、函数指针、指针函数详解

    指针难点 1.指针 1.1指针数组和数组指针 2.右左法则 3.函数指针和指针函数 示例1 示例2 示例3(面试题) 1.指针 1.1指针数组和数组指针 指针数组是一个数组,数组里面存放的内容是指针 ...

  10. 【C++学习】指针数组,数组指针,以及函数指针,以及堆中的分配规则--有是一篇好文章,收到自己门下 慢慢学习

    一 :关于指针和堆的内存分配 先来介绍一下指针 : 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量.既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上, ...

最新文章

  1. VMware vSphere 虚拟化简介
  2. 【DIY】最简单粗暴便宜的DIY定时器方法,没有之一
  3. Python 为啥不建议使用 thread模块?
  4. jdbc连接Oracle/MySQL数据库进行批量导入操作,如何提高效率???
  5. 20172326 《程序设计与数据结构》第六周学习总结
  6. c语言 函数的参数传递示例_C语言中带有示例的remove()函数
  7. 5.4监听socket
  8. 3)Thymeleaf th:* 设置/修改属性值详解
  9. Flash--提高flash的使用寿命(1)
  10. Ps(Adobephoto shop)当中布尔运算的使用方法
  11. 手机QQ邮箱登录不上的解决办法
  12. 企业生产计划排产该如何制定
  13. BAPI_EXCHANGERATE_GETDETAIL 取汇率
  14. wgs84坐标格式转换度分秒_WGS84经纬度坐标转换到西安80高斯投影坐标。
  15. android 黄金颜色,金光闪闪-六款经典款黄金首饰推荐
  16. C语言经典编程282例01
  17. 电脑默认字体如何进行替换教学
  18. matlab图像处理二,图像缩放、旋转、修剪
  19. bash: /home/xxx/anaconda3/bin/conda: No such file or directory
  20. DataStory·2017大数据商业创新论坛(上海站)圆满结束

热门文章

  1. windows server 2016 安装指南
  2. 前端基础---HTML
  3. 报错内容 IndentationError: unindent does not match any outer indentation level
  4. 记一次lnmp经历 nginx 多个php版本支持配置
  5. .net framework 2.0 安装包下载url
  6. 三层交换机与路由器的比较
  7. H.265的NALU
  8. 基于cnn的短文本分类_自然语言理解之(二)短文本多分类TextCNN实践
  9. python Pool常用函数用法总结
  10. 预产期计算器在线计算生男生女计算机,预产期计算器生男生女的四种算法