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. 【leetcode 简单】 第九十二题 第N个数字

    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 注意: n 是正数且在32为整形范围内 ( n < 231). 示例 1: ...

  2. c++ new 和delete

    c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间 ...

  3. Android选择头像

    http://www.jianshu.com/p/8b3e78046c1c 注意:在Android6.0之后,使用相机拍照需要权限 在选择头像使用相机拍摄时添加以下代码即可. Acp.getInsta ...

  4. Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装

    由于在下载Visual Studio 2010安装程序(大约3G左右)的时候速度飞快,大约几分钟下载完毕(多线程下载工具下载),所以笔者在继续安装Visual Studio 2010 SP1的时候也选 ...

  5. sql____001

    题目: create table my_001 (id int,value int); insert into my_001 values(1,10): insert into my_001 valu ...

  6. AopProxyUtils.getSingletonTarget(Ljava/lang/Object;)Ljava/lang/Object;大坑

    这个问题太坑了,试了好多个版本,都是依赖冲突导致的, https://blog.csdn.net/qq_15003505/article/details/78430595 最后找到这一篇博客解决了,就 ...

  7. 【洛谷】【洛谷月赛】4月月赛Round 1/2

    洛谷月赛“月”来“月”丧了,一月更比一月丧,做得我十分不“月”…… 4月的两轮月赛,都只会T1,就写一下吧,等待后续更新…… 先看看Round1的T1: [R1T1] 网址:点我 [题意简述] 给定一 ...

  8. JDk1.8源码StringBuffer

    一.概念 StringBuffer A thread-safe, mutable sequence of characters. A string buffer is like a {@link St ...

  9. MODULE_DEVICE_TABLE【转】

    转自:http://blog.csdn.net/tangkegagalikaiwu/article/details/8444249 This pci_device_id structure needs ...

  10. dstat 服务器性能查看命令【转】

    一. 安装和简解 # yum -y install dstat# dstat CPU状态:CPU的使用率.这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况.如果你看 ...