面向对象的模型(内存分布)
  • 对于一个对象而言,成员变量和成员函数是分开存放的

    • 成员函数位于代码段,所有的类对象共有

    • 成员变量为每一个对象独有,位于内存中

  • 类对象在内存中的分布和struct完全相同

  • 对于继承,子类的对象是在父类的对象的基础上,加上子类自己的成员

 #include <iostream>
#include <string> using namespace std; class Test
{
int mi;
public:
Test(int i = ) //转换构造函数
{
mi = i;
} void showMI()
{
cout<<"Test mi = "<< mi <<endl;
}
}; class Test1: public Test
{
int mj;
public:
Test1(int j = )
{
mj = j;
} void showMJ()
{
cout<<"Test mj = "<< mj <<endl;
}
}; struct T //T的结构和Test2的内存结构完全相同
{
int mi;
int mj;
}; int main()
{
Test2 t; T *p = reinterpret_cast<T *>(&t);
p->mi = ;
p->mj = ; t.showMI();
t.showMJ(); return ;
}
  • 如果类中有虚函数,那么对象中有一个指向虚函数类表的指针位于每一个对象中
 #include <iostream>
#include <string> using namespace std; class Test
{
int mi;
public:
Test(int i = ) //转换构造函数
{
mi = i;
} virtual void showMI()
{
cout<<"Test mi = "<< mi <<endl;
}
}; class Test1: public Test
{
int mj;
public:
Test1(int j = )
{
mj = j;
} virtual void showMJ()
{
cout<<"Test mj = "<< mj <<endl;
}
}; struct T //T的结构和Test2的内存结构完全相同
{
void *p;
int mi;
int mj;
}; int main()
{
Test2 t; T *p = reinterpret_cast<T *>(&t);
p->mi = ;
p->mj = ; t.showMI();
t.showMJ(); return ;
}
 #include <iostream>
#include <string> using namespace std; class Test
{
int mi;
public:
Test(int i = ) //转换构造函数
{
mi = i;
} virtual void showMI()
{
cout<<"Test mi = "<< mi <<endl;
}
}; class Test1
{
int mj;
public:
Test1(int j = )
{
mj = j;
} virtual void showMJ()
{
cout<<"Test mj = "<< mj <<endl;
}
}; class Test2 : public Test, public Test1
{
int mk;
public:
Test2(int k = )
{
mk = k;
} void showMK() //增加了虚函数
{
cout<<"Test mk = "<< mk <<endl;
}
}; struct T //T的结构和Test2的内存结构完全相同
{
void *p; //多了一个指向虚函数表的指针
int mi;
void *p1; //多了一个指向虚函数表的指针
int mj;
int mk;
}; int main()
{
Test2 t; T *p = reinterpret_cast<T *>(&t);
p->mi = ;
p->mj = ;
p->mk = ; t.showMI();
t.showMJ();
t.showMK(); return ;
}

C++语法小记---面向对象模型(实例的内存分布)的更多相关文章

  1. 转:c++类实例在内存中的分配

    转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...

  2. PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  3. 八、面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  4. 【转载】图说C++对象模型:对象内存布局详解

    原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...

  5. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

  6. Jinja2语法小记

    jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...

  7. PowerDesigner 面向对象模型(OOM)

    PowerDesigner 面向对象模型(OOM)说明 nulljavasystemstringpowerbuilderclass   目录(?)[+]   一.     OOM 简介 Object- ...

  8. 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。

    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了.   步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...

  9. python_如何为创建大量实例节省内存?

    案例: 某网络游戏中,定义了玩家类Player(id, name, status,....),每有一个在线玩家,在服务器程序内有一个Player的实例,当在线人数很多时,将产生大量实例(百万级别) 需 ...

随机推荐

  1. 8.eclipse 安装 lombook插件

    参考博客:https://www.liangzl.com/get-article-detail-129979.html

  2. IDEA 使用jebel热部署插件启动失败

    在使用Jebel热部署插件开发springmvc时,启动会出现内存溢出错误.可在配置Tomcat时增加JVM参数解决. -Xms768m -Xmx768m -XX:PermSize=64M -XX:M ...

  3. 入门大数据---SparkSQL常用聚合函数

    一.简单聚合 1.1 数据准备 // 需要导入 spark sql 内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSe ...

  4. Maven搭建Spring MVC

    Maven搭建SpringMVC 点击Enable Auto Import 下面配置文件 配置两个文件 web.app-->Web-INF--web.xml <!DOCTYPE web-a ...

  5. java普通对象和json字符串的互转

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  6. 全网最深分析SpringBoot MVC自动配置失效的原因

    前言 本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及官方文档都说明了原因,但还是想亲自看一看,本以为很简单的事 ...

  7. ZooKeeper 数据模型:节点的特性与应用

    zk的基础知识基本分为三大模块 数据模型 ACL 权限控制 Watch 监控 数据模型 默认配置文件 # The number of milliseconds of each tick tickTim ...

  8. models.py连接mysql

    安装pymysql: other setting---project Interpreter---+pymysql 更改数据库 在项目名的同名文件下的settings.py中DATABASES,改成 ...

  9. 新技术新框架不断涌现,目前学习web前端开发都要掌握什么?

    web前端开发由网页制作演变而来,随着web2.0的发展,网页不再只是承载单一的文字和图片,各种丰富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现 ...

  10. c# 操作Redis的五种基本类型总结

    在我们的项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQL Server,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳,而且存储的数据多为结构化 ...