本文所才用的编译环境是VC++6.0

作用

指向data members的指针,是一个有点神秘但颇有用处的语言特性,特别是如果需要详细调查 class members的底层布局的话,这样的调用可以决定vptr是放在 class 的起始位置或是尾端.另一个用途,可用来决定 class 中的access sections的次序

来看一个TEST类 不带虚函数

class TEST
{public:int nX;int nY;int nZ;double dJ;
};

下面对该类进行测试

// Test.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;int main(int argc, char* argv[])
{cout<<sizeof(TEST)<<endl;int TEST::* p = &TEST::nX;printf("offest nX = %d\n", p);cout<<"offest nX = "<<p<<endl;p = &TEST::nY;printf("offest nY = %d\n", p);cout<<"offest nY = "<<p<<endl;p = &TEST::nZ;printf("offest nZ = %d\n", p);cout<<"offest nXZ = "<<p<<endl;p = NULL;printf("offest NULL = %d\n", p);cout<<"offest NULL = "<<p<<endl;double TEST::* pD = &TEST::dJ;printf("offest dJ = %d\n", pD);cout<<"offest dj = "<<pD<<endl;return 0;
}

测试结果


①sizeof大小 就是结构体的内存对齐24 没什么好讲的
②printf的结果可以看出 nX nY nZ dJ的偏移量 就是按照他们在类声明的时候的顺序排列的
③一个指向NULL的Data Members的指针 他的offset 会被编译器置-1
④为什么cout输出的 只有0/1 因为输出的是一个bool值,代表有无偏移

*****************************************************

下面加上虚函数,来判断虚函数指针的摆放位置

class TEST
{public:int nX;int nY;int nZ;virtual void Fun(void);
};
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;int main(int argc, char* argv[])
{cout<<sizeof(TEST)<<endl;int TEST::* p = &TEST::nX;printf("offest nX = %d\n", p);cout<<"offest nX = "<<p<<endl;p = &TEST::nY;printf("offest nY = %d\n", p);cout<<"offest nY = "<<p<<endl;p = &TEST::nZ;printf("offest nZ = %d\n", p);cout<<"offest nXZ = "<<p<<endl;p = NULL;printf("offest NULL = %d\n", p);cout<<"offest NULL = "<<p<<endl;return 0;
}

结果

结论

①我们可以看出 虚指针是放在类的非成员变量的上边,无论他声明的位置
②为什么加了虚函数后,printf的offest NULL就变成了0

问题

为什么加了虚函数后,printf的offest NULL就变成了0,大家知道的可以告诉我

C++对象模型——指向Data Members的指针(Pointer to Data Members)相关推荐

  1. C语言结构体的定义与使用、结构体数组、指向结构体的指针(有代码详解)

    1.结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数 ...

  2. 数组指针——指向数组对象的指针

    转载自:数组指针 数组指针--指向数组对象的指针 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的 ...

  3. const指针与指向const对象的指针

    一. 指向const对象的指针: 定义形式:const double *cptr; const限定了指针指向的对象类型,指针本身不是const类型 特征: 1.不能通过指针改变const对象的值,但是 ...

  4. C++教程:指向成员函数的指针

    转载自:https://kelvinh.github.io/blog/2014/03/27/cpp-tutorial-pointer-to-member-function/ Kelvin的胡言乱语 = ...

  5. C++:将char*指针强制转换成一个指向结构体的指针

    在使用Socket与雷达进行通信采集数据时,会遇到"打包与解包"的问题,在打包和解包过程中,会涉及到结构体指针与字符指针间的强制转换.如下: 打包就是将包头与信息封装成一定大小的包 ...

  6. C++走向远洋——39(指向学生类的指针)

    */* Copyright (c) 2016,烟台大学计算机与控制工程学院* All rights reserved.* 文件名:zhizhen.cpp* 作者:常轩* 微信公众号:Worldhell ...

  7. c语言中的字节和元素,C语言指向数组元素的指针

    指向数组元素的指针和运算法则 所谓指向数组元素的指针,其本质还是变量的指针.因为数组中的每个元素,其实都可以直接看成是一个变量,所以指向数组元素的指针,也就是变量的指针. 指向数组元素的指针不难,但很 ...

  8. 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释

    1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...

  9. 对C语言 结构数组 指向结构变量的指针 指向结构数组的指针

    一.结构数组的定义 数组的元素可以是结构类型的.结构数组的每一个元素都是具有相同的结构类型的下标结构变量.在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体. 如:一个班的学生的档案,一个车 ...

  10. 【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

    文章目录 一.字符串 一级指针 内存模型 1.指定大小字符数组 2.未指定大小字符数组 3.指向常量字符串的指针 4.指向堆内存的指针 一.字符串 一级指针 内存模型 #include <std ...

最新文章

  1. php json josn_decode()返回的是对像,如何把对像转成数组
  2. Intellij IDEA自动部署项目至远程FTP服务器
  3. adb connect 出现timeout的处理方式
  4. 某些小时后MySql连接自动掉线
  5. 深入理解SQL注入绕过WAF与过滤机制
  6. 遇见未来 | 基于软件定义存储的数据加速解决方案:让你的系统加速跑
  7. C++继承机制(三)——多继承、菱形继承、虚继承原理
  8. 【Docker】文件拷贝
  9. Spring框架——day04参数校验和文件上传
  10. 尚学堂__百战程序员__1573题------第一章 初始java
  11. IIS 部署的网站无法启动
  12. IntelliJ IDEA文件模板变量
  13. 创意PS:-----程序员变身超人
  14. spring cloud alibaba全家桶之nacos
  15. 题目 2322: 大鱼吃小鱼
  16. 1072:鸡尾酒疗法
  17. 天蝎项目整机柜服务器技术规格,天蝎整机柜服务器技术规范2.5.doc
  18. 回顾一年的IT学习历程与大学生活
  19. android10 三星升级计划,三星公布Android 10.0国行升级计划:规模庞大
  20. 【转载】世界十大名咖啡

热门文章

  1. 使用scroll实现Elasticsearch数据遍历和深度分页
  2. RedisTemplate常用使用说明-opsForHash(3)
  3. JavaScript 复习之 XMLHttpRequest 对象
  4. electron webview 页面加载事件顺序
  5. Java 中override、overload、overwrite区别,以及与多态的关系
  6. JSP WEB开发入门基础到高手进阶教程001
  7. cxGrid使用笔记
  8. Google Talk的一个问题
  9. Android中使用Fragment实现标题栏(不可滑动)
  10. php monolog 使用,PHP 依赖工具 monolog的使用