首页 / C++ / C++对象模型分析(上)
C++对象模型分析(上)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++对象模型分析(上),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3304字,纯文字阅读大概需要5分钟。
内容图文
![C++对象模型分析(上)](/upload/InfoBanner/zyjiaocheng/644/4fda36704c954b55856f039e4e37134a.jpg)
- 回归class(对象)的本质
- class是一种特殊的struct
- 在内存中class依旧可以看作变量的集合
- class与struct遵循相同的内存对齐规则
- class中的成员函数与成员变量是分开存放的,每个对象有独立的成员变量,所有对象共享类中的成员函,。
- 思考一个问题
- 对象内存布局实验
1 // 对象内存布局实验.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 class A 7 { 8 int a; 9 int b; 10 char c; 11 double d; 12 public: 13 void print() 14 { 15 cout << "a=" << a << "," 16 << "b=" << b << "," 17 << "c=" << c << "," 18 << "d=" << d << endl; 19 } 20 21 }; 22 struct B 23 { 24 int a; 25 int b; 26 char c; 27 double d; 28 }; 29 int main() 30 { 31 A a; 32 a.print(); 33 cout << "sizeof(A) = " << sizeof(A) << endl; 34 cout << "sizeof(a) = " << sizeof(a) << endl; 35 cout << "sizeof(B) = " << sizeof(B) << endl; 36 B* p = reinterpret_cast<B*>(&a); 37 p->a = 1; 38 p->b = 2; 39 p->c = 'C'; 40 p->d = 1.234; 41 a.print(); 42 }
- 运行结果
a=-858993460,b=-858993460,c=?d=-9.25596e+61 sizeof(A) = 24 sizeof(a) = 24 sizeof(B) = 24 a=1,b=2,c=C,d=1.234
- 运行时的对象退化为结构体的形式
- 所有成员变量在内存中依次排布
- 成员变量可能存在内存空隙
- 可以通过内存地址直接访问成员变量
- 访问权限关键字在运行时失效
- 类中的成员函数位于代码段中
- 调用成员函数时对象地址作为参数隐式传递
- 成员函数通过对象地址访问成员变量
- C++语法规则隐藏了对象地址的传递过程
- 实验:用C语言来写面向对象,加深C++面向对象的理解。
1 #include "stdio.h" 2 #include "oop.h" 3 int main() 4 { 5 struct OOP* THIS = NULL; 6 //【step1】执行“构造函数” 7 THIS = (struct OOP*)Great_Object(1,2); 8 //【step2】执行成员函数,成员函数必须带有对象地址,通过对象地址访问成员变量 9 printf("THIS->value1=%d\n", GET_Value1(THIS)); 10 printf("THIS->value2=%d\n", GET_Value2(THIS)); 11 //【step3】执行“析构函数” 12 Free_Object(THIS); 13 } 14? OOP.c
1 #include "oop.h" 2 #include "stdio.h" 3 DEMO* Great_Object(int i, int j) 4 { 5 struct OOP* Object = (struct OOP*)malloc(sizeof(struct OOP)); 6 if (Object!=NULL) 7 { 8 Object->value1 = 1; 9 Object->value2 = 2; 10 } 11 return Object; 12 } 13 int GET_Value1(DEMO* pthis) 14 { 15 struct OOP* ret = (struct OOP*)pthis; 16 return ret->value1; 17 } 18 int GET_Value2(DEMO* pthis) 19 { 20 struct OOP* ret = (struct OOP*)pthis; 21 return ret->value2; 22 } 23 void Free_Object(DEMO* pthis) 24 { 25 free(pthis); 26 }OOP.h
#ifndef _OOP_H_ #define _OOP_H_ typedef void DEMO; struct OOP { int value1; int value2; }; //【step1】模拟C++的构造函数,需要返回this指针 DEMO* Great_Object(int i,int j); //【step2】定义成员函数,获取成员变量的值,需要传递对象的地址 int GET_Value1(DEMO* pthis); //【step2】定义成员函数,获取成员变量的值,需要传递对象的地址 int GET_Value2(DEMO* pthis); //...... //【step3】模拟C++中的析构函数 void Free_Object(DEMO* pthis); #endif
- 小结
- C++中的类对象在内存布局上与结构体相似
- 成员变量和成员函数在内存中分开存放
- 访问权限关键字在运行时失效
- 调用成员函数时对象地址作为参数隐式传递
内容总结
以上是互联网集市为您收集整理的C++对象模型分析(上)全部内容,希望文章能够帮你解决C++对象模型分析(上)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。