C++对象模型——指向Data Members的指针(Pointer to Data Members)
本文所才用的编译环境是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)相关推荐
- C语言结构体的定义与使用、结构体数组、指向结构体的指针(有代码详解)
1.结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数 ...
- 数组指针——指向数组对象的指针
转载自:数组指针 数组指针--指向数组对象的指针 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的 ...
- const指针与指向const对象的指针
一. 指向const对象的指针: 定义形式:const double *cptr; const限定了指针指向的对象类型,指针本身不是const类型 特征: 1.不能通过指针改变const对象的值,但是 ...
- C++教程:指向成员函数的指针
转载自:https://kelvinh.github.io/blog/2014/03/27/cpp-tutorial-pointer-to-member-function/ Kelvin的胡言乱语 = ...
- C++:将char*指针强制转换成一个指向结构体的指针
在使用Socket与雷达进行通信采集数据时,会遇到"打包与解包"的问题,在打包和解包过程中,会涉及到结构体指针与字符指针间的强制转换.如下: 打包就是将包头与信息封装成一定大小的包 ...
- C++走向远洋——39(指向学生类的指针)
*/* Copyright (c) 2016,烟台大学计算机与控制工程学院* All rights reserved.* 文件名:zhizhen.cpp* 作者:常轩* 微信公众号:Worldhell ...
- c语言中的字节和元素,C语言指向数组元素的指针
指向数组元素的指针和运算法则 所谓指向数组元素的指针,其本质还是变量的指针.因为数组中的每个元素,其实都可以直接看成是一个变量,所以指向数组元素的指针,也就是变量的指针. 指向数组元素的指针不难,但很 ...
- 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释
1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...
- 对C语言 结构数组 指向结构变量的指针 指向结构数组的指针
一.结构数组的定义 数组的元素可以是结构类型的.结构数组的每一个元素都是具有相同的结构类型的下标结构变量.在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体. 如:一个班的学生的档案,一个车 ...
- 【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )
文章目录 一.字符串 一级指针 内存模型 1.指定大小字符数组 2.未指定大小字符数组 3.指向常量字符串的指针 4.指向堆内存的指针 一.字符串 一级指针 内存模型 #include <std ...
最新文章
- php json josn_decode()返回的是对像,如何把对像转成数组
- Intellij IDEA自动部署项目至远程FTP服务器
- adb connect 出现timeout的处理方式
- 某些小时后MySql连接自动掉线
- 深入理解SQL注入绕过WAF与过滤机制
- 遇见未来 | 基于软件定义存储的数据加速解决方案:让你的系统加速跑
- C++继承机制(三)——多继承、菱形继承、虚继承原理
- 【Docker】文件拷贝
- Spring框架——day04参数校验和文件上传
- 尚学堂__百战程序员__1573题------第一章 初始java
- IIS 部署的网站无法启动
- IntelliJ IDEA文件模板变量
- 创意PS:-----程序员变身超人
- spring cloud alibaba全家桶之nacos
- 题目 2322: 大鱼吃小鱼
- 1072:鸡尾酒疗法
- 天蝎项目整机柜服务器技术规格,天蝎整机柜服务器技术规范2.5.doc
- 回顾一年的IT学习历程与大学生活
- android10 三星升级计划,三星公布Android 10.0国行升级计划:规模庞大
- 【转载】世界十大名咖啡
热门文章
- 使用scroll实现Elasticsearch数据遍历和深度分页
- RedisTemplate常用使用说明-opsForHash(3)
- JavaScript 复习之 XMLHttpRequest 对象
- electron webview 页面加载事件顺序
- Java 中override、overload、overwrite区别,以及与多态的关系
- JSP WEB开发入门基础到高手进阶教程001
- cxGrid使用笔记
- Google Talk的一个问题
- Android中使用Fragment实现标题栏(不可滑动)
- php monolog 使用,PHP 依赖工具 monolog的使用