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

换句话说,C++编译器是如何管理类、对象、类和对象之间的关系?也就是说,具体对象调用类写的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法的?

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

通过上述程序的运行,得到上述的输出都为12

也就是说在数据的处理上,结构体和类的行为是类似的

其实有以下结论:

  1. C++类对象中的成员变量和成员函数是分开存储的
  • 成员变量:

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

    静态成员变量:存储于全局数据区中
  • 成员函数:存储于代码段中。

    问题出来了:很多对象公用一块代码?代码是如何区分具体对象的那?
  1. C++编译器对普通成员函数的内部处理

    C++会添加一个指向自身的指针,用以明确是哪个对象调用

Test t(1,2); //-->Test(this, 1, 2);-->Test(&t, 1, 2);

结论:

  • C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!
  • C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。
  • 静态成员函数、成员变量属于类
  • 静态成员函数与普通成员函数的区别

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

    普通成员函数包含一个指向具体对象的指针

C++学习笔记-面向对象模型探究的更多相关文章

  1. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  2. springmvc学习笔记---面向移动端支持REST API

    前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...

  3. Swift 学习笔记(面向协议编程)

    在Swift中协议不仅可以定义方法和属性,而且协议是可以扩展的,最关键的是,在协议的扩展中可以添加一些方法的默认实现,就是在协议的方法中可以实现一些逻辑,由于这个特性,Swift是可以面向协议进行编程 ...

  4. Spring学习笔记-面向切面(AOP)-04

    什么是面向切面编程 先大概了解一下部分术语 横切关注点:软件开发中,散布于多出的功能称为横切关注点(cross-cutting concern),简单的可以描述为可以影响应用多处的功能,比如日志.安全 ...

  5. Spring学习笔记--面向切面编程(AOP)

    什么是AOP AOP(Aspect Oriented Programming),意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ...

  6. DuiLib学习笔记3——颜色探究

    在前面两篇日志已经能使用xml了.今天准备好好的折腾一番,结果在颜色上却掉坑里了. 起初我在ps里取颜色为0104ff 这里01为R,04为G,ff为B 在控件的属性里有这样一个属性bkcolor=& ...

  7. golang学习笔记 ---面向并发的内存模型

    Go语言是基于消息并发模型的集大成者,它将基于CSP模型的并发编程内置到了语言中,通过一个go关键字就可以轻易地启动一个Goroutine,与Erlang不同的是Go语言的Goroutine之间是共享 ...

  8. DuiLib学习笔记3.颜色探究

    在前面两篇日志已经能使用xml了.今天准备好好的折腾一番,结果在颜色上却掉坑里了. 起初我在ps里取颜色为0104ff 这里01为R,04为G,ff为B 在控件的属性里有这样一个属性bkcolor=& ...

  9. Android学习笔记(二)——探究一个活动

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一 ...

随机推荐

  1. electron-vue [Vue warn]: Failed to resolve directive: decorator

    electron-vue引入ant-desigin-vue使用ant自定义指令 v-decorator报销 <a-form-item> <a-input v-decorator=&q ...

  2. python- www.thisamericanlife.org转pdf

    环境安装 pip install requests pip install beautifulsoup4 pip install pdfkit $ sudo apt-get install wkhtm ...

  3. UNIX下socket通信 - UDP通信

    一.UNIX下socket通信: socket套接字是一种可以进行网络通信的内核对象,它是一个唯一的标示符,一般称它为socket描述符. 注意:UDP通信需要客户端先发送消息,服务端先进行等待客户端 ...

  4. Hibernate 5 Maven 仓库的 Artifacts

    Hibernate artifacts 官方发布的仓库在 JBoss Maven repository 中.Hibernate 发布的 artifacts 也会同时同步到 Maven Central ...

  5. URAL 2036 Intersect Until You're Sick of It 形成点的个数 next_permutation()函数

    A - Intersect Until You're Sick of It Time Limit:500MS     Memory Limit:65536KB     64bit IO Format: ...

  6. FZU - 2103 Bin & Jing in wonderland

    FZU - 2103 Bin & Jing in wonderland 题目大意:有n个礼物,每次得到第i个礼物的概率是p[i],一个人一共得到了k个礼物,然后按编号排序后挑选出r个编号最大的 ...

  7. 四、SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换

    简述: mybatis驼峰式命名规则自动转换: 使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”:使用好处:省去mapper.xml文件中繁琐编写表字段列表与表 ...

  8. 了解dubbo+zookeeper

    一.Dubbo是什么? Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程 ...

  9. 使用Grizzy+Jersey搭建一个RESTful框架()报错Exception in thread "main" java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;

    报错的类涉及UriBuilder,我搜索类发现, 这个类存在于两个包中,我在baidu的时候,也有人提到是jar包冲突,我就删除了 这个依赖,问题解决了. 环境搭建过程请见地址https://blog ...

  10. Java-JVM 自定义类加载器

    一.sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建) public Launcher() { Launcher.ExtClassLoade ...