第50课 C++对象模型分析(上)
1. 回归本质
(1)class是一种特殊的结构体
①在内存中class依旧可以看作变量的集合
②class与struct遵循相同的内存对齐规则
③class中的成员函数与成员变量是分开存放的。即每个对象有独立的成员变量,但所有对象共享类中的成员函数。
【编程实验】对象内存布局初探
#include <iostream>
#include <string>
using namespace std;
class A
{
//默认访问权限为private
int i;
int j;
char c;
double d;
public:
void print()
{
cout << "i = " << i << ", "
<< "j = " << j << ", "
<< "c = " << c << ", "
<< "d = " << d << endl;
}
};
struct B
{
//默认访问权限为public
int i;
int j;
char c;
double d;
};
int main()
{
A a;
//class和struct在内存布局上是一样的。大小相同
cout << "sizeof(A) = " << sizeof(A) << endl; //24 bytes
cout << "sizeof(a) = " << sizeof(a) << endl; //24 bytes
cout << "sizeof(B) = " << sizeof(B) << endl; //24 bytes
cout << endl;
a.print();
cout << endl;
B* p = reinterpret_cast<B*>(&a); //将类强制转化结构体
//利用结构体对类的private成员进行赋值(注意是private成员)
//说明class在运行时,private访问权限只在编译期起作用。
p->i = ;
p->j = ;
p->c = 'C';
p->d = 3.14;
a.print(); //class中的private成员被改变
;
}
/*输出结果
sizeof(A) = 24
sizeof(a) = 24
sizeof(B) = 24
i = 4202544, j = 65535, c = , d = 8.69169e-311
i = 100, j = 200, c = C, d = 3.14
*/
(2)运行时的对象退化为结构体的形式
①所有成员变量在内存中依次排布
②成员变量间可能存在内存空隙
③可以通过内存地址直接访问成员变量
④访问权限关键字在运行时失效
2. C++对象模型
(1)类中的成员函数位于代码段中
(2)调用成员函数时对象地址作为参数隐式传递
(3)成员函数通过对象地址访问成员变量
(4)C++语法规则隐藏了对象地址的传递过程
【编程实验】对象本质分析(用C写面向对象)
//C++示例
#include <iostream>
#include <string>
using namespace std;
class Demo
{
int mi;
int mj;
public:
Demo(int i, int j)
{
mi = i;
mj = j;
}
int getI()
{
return mi;
}
int getJ()
{
return mj;
}
int add(int value)
{
return mi + mj + value;
}
};
int main()
{
Demo d(, );
cout <<
cout <<
cout <<
cout << ) << endl;
;
}
//C语言模拟面向对象
//50-2.h
#ifndef _50_2_H_ #define _50_2_H_ typedef void Demo; //声明成员函数(接口) Demo* Demo_Create(int i, int j); int Demo_GetI(Demo* pThis); int Demo_GetJ(Demo* pThis); int Demo_Add(Demo* pThis, int value); void Demo_Free(Demo* pThis); #endif
//50-2.c
#include "50-2.h"
#include <malloc.h>
//利用C语言来实现面向对象
//定义结构体
struct ClassDemo
{
int mi;
int mj;
};
//实现各成员函数(带this指针)
//构造函数
Demo* Demo_Create(int i, int j)
{
struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo));
)
{
ret ->mi = i;
ret ->mj = j;
}
return ret;
}
int Demo_GetI(Demo* pThis)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mi;
}
int Demo_GetJ(Demo* pThis)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mj;
}
int Demo_Add(Demo* pThis, int value)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mi + obj->mj + value;
}
//析构函数
void Demo_Free(Demo* pThis)
{
free(pThis);
}
//main.c
#include <stdio.h>
#include "50-2.h"
int main(void)
{
Demo* d = Demo_Create(, ); //Demo* d = new Demo(1, 2);
//各函数调用中,传处this指针:d
printf("d.mi = %d\n", Demo_GetI(d)); //d->getI();
printf("d.mj = %d\n", Demo_GetJ(d)); //d->getJ();
printf()); //d->add(3);
//d->mi = 100; //相当于私有变量,不能直接通过this指针(d)来访问
Demo_Free(d);
;
}
3. 小结
(1)C++中的类对象在内存布局上与结构体相同
(2)成员变量和成员函数在内存中分开存放
(3)访问权限关键字在运行时失效
(4)调用成员函数时对象地址作为参数隐式传递
第50课 C++对象模型分析(上)的更多相关文章
- 第50 课C++对象模型分析——成员变量(上)
C++对象模型,其实就是C++中的对象在内存中是如何排布的.C++中的对象包含了成员变量和成员函数,其实就是研究C++中的类对象它的成员变量和成员函数在内存中是如何排布的. 回归本质class 是一种 ...
- 第50 课C++对象模型分析——成员函数(上)
类中的成员函数位于代码段中调用成员函数时对象地址作为参数隐式传递成员函数通过对象地址访问成员变量C++语法规则隐藏了对象地址的传递过程 #include<iostream> #includ ...
- 第51课 C++对象模型分析(下)
1. 单继承对象模型 (1)单一继承 [编程实验]继承对象模型初探 #include <iostream> using namespace std; class Demo { protec ...
- Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation
原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- 第24课 - #pragma 使用分析
第24课 - #pragma 使用分析 1. #pragma简介 (1)#pragma 是一条预处理器指令 (2)#pragma 指令比较依赖于具体的编译器,在不同的编译器之间不具有可移植性,表现为两 ...
- R与数据分析旧笔记(六)多元线性分析 上
> x=iris[which(iris$Species=="setosa"),1:4] > plot(x) 首先是简单的肉眼观察数据之间相关性 多元回归相较于一元回归的 ...
- C++对象模型的那些事儿之一:对象模型(上)
前言 很早以前就听人推荐了<深入理解C++对象模型>这本书,从年初买来到现在也只是偶尔翻了翻,总觉得晦涩难懂,放在实验室上吃灰吃了好久.近期由于找工作对C++的知识做了一个全面系统的学习, ...
- 拥有的50个CSS代码片段(上)
1. CSS 重置 ;;;font-size: 100%; font: inherit; vertical-align: baseline; outline: none; -webkit-box-si ...
- 知识小罐头05(tomcat8请求源码分析 上)
这一篇我们不看源码,就大概理一下Tomcat内部组成部分!前面花费了两篇博客的篇幅来说说了一般的maven web项目并部署到tomcat运行,其实都是为这篇做铺垫的! 其实我下载了tomcat7,t ...
随机推荐
- jquery.ajax error调试
$(document).ready(function() { jQuery("#clearCac").click(function() { jQuery.ajax({ url: u ...
- [C#]多线程下载
发现电脑里以前编写的下载程序... 做个记录,那时做的挺匆忙的,没用委托,通过公开出窗体来修改下载进度,做的比较乱... ==!! 程序具体功能(流程): 1.检测系统托盘图标内的进程名是否符合要求 ...
- Win7 64位下sql server链接oracle的方法
继上一次mysql同步sql server后,这一次需要将Oracle同步到sql server上来,方案相似,只是在sql server链接oracle的时候费了很多时间. 一.测试环境 本方案实现 ...
- Android Studio 使用小技巧
1.如何打开设置界面? File --> Settings 快捷键 Ctrl + Alt + s 2.修改Java文件字体大小 ? File --> Settings --> E ...
- iOS之学习资源收集--很好的IOS技术学习网站
点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...
- Swift面向对象基础(中)——Swift中的存储属性和计算属性
学习来自<极客学院> 1.存储属性:存储在类.结构体里的变量或者常量 2.分为:实例存储属性.类型存储属性 3.所有的存储属性必须显示的指定初始值,在定义时或者构造器当中指定 4.可选类型 ...
- Linux平台卸载MySQL总结【转】
最近用到了mysql主从,顺手看到了这篇文章,拿出来分享一下. 转自:http://www.cnblogs.com/kerrycode/p/4364465.html 潇湘隐者 RPM包安装方式的MyS ...
- Maven学习遇到的第一个错误
现在开始学习maven,我是在极客学院看的视频学习的,学习当然会遇到异常,下面是我遇到的第一个异常 [ERROR] Failed to execute goal org.apache.maven.pl ...
- yum安装mariadb
安装mysql yum install mariadb mariadb-server MySQL-python mysql-devel Package MySQL-python-1.2.5-1.ibm ...
- python 发送邮件函数模块
发送邮件函数功能 #!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.mime.text import MIM ...