C++对象模型可以概括为以下2部分: 

  1. 语言中直接支持面向对象程序设计的部分,主要涉及如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等。

  2. 对于各种支持的底层实现机制。在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数据和函数,来实现数据和函数直接的绑定。

  概括来说,在C++类中有两种成员数据:static、nonstatic;三种成员函数:static、nonstatic、virtual。

1.基础知识

  C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类。从计算机的角度,程序依然由数据段和代码段构成。

  C++编译器如何完成面向对象理论到计算机程序的转化?

  换句话:C++编译器是如何管理类、对象、类和对象之间的关系

  具体的说:具体对象调用类中的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那?

  思考一下以下代码:

#include <iostream>
using namespace std; class C1
{
public:
int i;
int j;
int k;
protected:
private:
}; class C2
{
private:
int i;
int j;
int k;
static int m;
public:
int getK() const { return k; }
void setK(int val) { k = val; }
}; struct S1
{
int i;
int j;
int k;
}; struct S2
{
int i;
int j;
int k;
static int m;
}; int main()
{
cout << "c1:" << sizeof(C1) << endl;
cout << "c2:" << sizeof(C2) << endl;
cout << "s1:" << sizeof(S1) << endl;
cout << "s2:" << sizeof(S2) << endl;
system("pause");
}

  考虑一下,上述的输出结果都为多少?通过执行,我们会发现结果全为12.为什么会这样呢?

  是因为C++类对象中的成员变量和成员函数是分开存储的。

  成员变量:

    普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式

    静态成员变量:存储于全局数据区中。

  成员函数:存储于代码段中。

  通过上面,我们可以得知,成员变量(除静态变量外)都会拷贝一份存储在对象中。而成员函数在内存中,仅仅只有一份。那么问题就来,C++编译器是如何得知是对象obj1在调用func还是obj2在调用func呢?

  换句话说:int getK() const { return k; },具体obj1、obj2、obj3对象是如何知道自己在调用自己的那个getK()函数呢?

  接着往下看...

2.C++编译器对普通成员函数的内部处理

  我们在类中定义了一个类成员函数,在执行编译阶段C++编译器会将类成员函数变形:

  比如:

class Test
{
private:
int i;
public:
Test(int j){
i = j;
}
};

  上述代码在编译阶段,等价于如下:

struct Test
{
int i;
}; void Test_init(Test *pthis, int j)
{
pthis->i = j;
}

  也就是给函数添加上一个指针变量,这个指针变量是指向对象本身的,当对象调用這个方法的时候,指针变量就指向了這个对象,从而完成了绑定操作,以后只要是這个对象在调用类成员函数,编译器就能很快知道。

  这也就是C++中隐含的this指针的奥妙之处。

  还有一点要注意:

  C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。

  静态成员函数不包含指向具体对象的指针

3.this指针

   类成员函数都默认隐含了一个this指针,作用是接受调用对象的地址;

    

  this指针应用场景:

    若类成员函数的形参和类的属性,名字相同,通过this指针来解决。

    操作符重载!

4.其他

  下面,我们来看一段代码

class Test
{
private:
int i;
public:
Test(int i){
this->i = i;
}
int getNum()const{ //这里的const修饰的是谁?
return i;
}
};

  答案:this指针

  我们来测试一下,编译直接报错

class Test
{
private:
int i;
public:
Test(int i){
this->i = i;
}
int getNum()const{
this->i = ;
}
};

  因此,可以证明我之前的答案!

深入剖析cpp对象模型的更多相关文章

  1. 【Python源码剖析】对象模型概述

    Python 是一门 面向对象 语言,实现了一个完整的面向对象体系,简洁而优雅. 与其他面向对象编程语言相比, Python 有自己独特的一面. 这让很多开发人员在学习 Python 时,多少有些无所 ...

  2. BOM:浏览器对象模型之浏览器剖析入门

    BOM简介 BOM与DOM的关系 BOM对象包含的内容 重新认识浏览器 一.分裂的BOM和被收服的DOM BOM定义:是browser object model的缩写,简称浏览器对象模型. 主要处理浏 ...

  3. 剖析虚幻渲染体系(15)- XR专题

    目录 15.1 本篇概述 15.1.1 本篇内容 15.1.2 XR概念 15.1.2.1 VR 15.1.2.2 AR 15.1.2.3 MR 15.1.2.4 XR 15.1.3 XR综述 15. ...

  4. C++ 系列:C++ 对象模型

    1      何为C++对象模型 C++对象模型可以概括为以下2部分: 1.语言中直接支持面向对象程序设计的部分: 2.对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数.析 ...

  5. TaintDroid剖析之File & Memiry & Socket级污点传播

    TaintDroid剖析之File & Memiry & Socket级污点传播 作者:简行.走位@阿里聚安全 1.涉及到的代码文件 TaintDroid在File, Memory以及 ...

  6. TaintDroid剖析之IPC级污点传播

    TaintDroid剖析之IPC级污点传播 作者:简行.走位@阿里聚安全 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟 ...

  7. TaintDroid剖析之Native方法级污点跟踪分析

    1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪—— ...

  8. TaintDroid剖析之DVM变量级污点跟踪(下篇)

    TaintDroid剖析之DVM变量级污点跟踪(下篇)作者:简行.走位@阿里聚安全 ​ 1 回顾 在上一章节中我们详细分析了TaintDroid对DVM方法参数和方法变量的变量级污点跟踪机制,现在我们 ...

  9. TaintDroid深入剖析之启动篇

    ​1 背景知识 1.1   Android平台软件动态分析现状 众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外.而随着软件加固.混淆技术的不 ...

随机推荐

  1. python概念-常用模块之究竟你是什么鬼

    模块: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 说白了,就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文件所调用 ...

  2. 【译】第七篇 Integration Services:中级工作流管理

    本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcur ...

  3. 南京邮电大学 CTF 逆向部分 Writeup

    Hello,RE! 提示 IDA 中按 R . Google 到 IDA 中 R 快捷键是 Character ,转为字符串. 丢进 IDA(虽然我并不会使用 IDA 有个 strcmp 函数,比较 ...

  4. 查看Linux系统版本的几种方法

    第一种: cat /etc/os-release # 或者 cat /etc/redhat-release 结果如下: NAME="Ubuntu" VERSION="16 ...

  5. Spring4笔记11--SSH整合2--SpringWeb

    SSH 框架整合技术: 2. Spring 在 Web 项目中的使用(建立在Spring与Hibernate整合的基础上): 在 Web 项目中使用 Spring 框架,首先要解决在 Servlet ...

  6. QEMU漏洞挖掘

    转载:https://www.tuicool.com/articles/MzqYbia qemu是一个开源的模拟处理器硬件设备的全虚拟化仿真器和虚拟器. KVM(kernel virtual mach ...

  7. 虚拟机使用主机ss代理

    环境Linux mint 设置好主机ss代理,并开启[允许来自局域网的链接] 在Linux虚拟机的system setting-network手动设置代理 地址全部填入刚刚的主机地址,端口号为主机ss ...

  8. httpd功能配置之虚拟主机【转】

    apache默认使用80端口提供服务,使用主服务器配置的话,一台物理机只能提供一个站点服务:可以使用虚拟主机方式提供不同的访问,以实现一台主机提供多站点服务. 虚拟主机的实现方式有三种:基于端口.基于 ...

  9. Oracle和MySQL的高可用方案对比【转】

    关于Oracle和MySQL的高可用方案,其实一直想要总结了,就会分为几个系列来简单说说.通过这样的对比,会对两种数据库架构设计上的细节差异有一个基本的认识.Oracle有一套很成熟的解决方案.用我在 ...

  10. Isolate randomforest检测异常点的非监督方法

    由于异常数据的两个特征(少且不同: few and different) 异常数据只占很少量; 异常数据特征值和正常数据差别很大. iTree的构成过程如下: l  随机选择一个属性Attr: l  ...