当前位置: 首页 > news >正文

C++ 类的本质 札记

原文地址:http://hi.baidu.com/chzhao007/blog/item/e9dbc5ac1191bc034b36d6df.html

前几天,我竟被只小鸟小觑了一下,我承认本人blog中张贴出来的代码确实一般,所以我得在此在重审一下:本人张贴出来的代码都不是本人最终代码!
本人blog中到现在确实用C写的代码很多,但不代表本人不崇尚C++的对象编程,只不过本人现在从事的许多方面用C和汇编搞起来比较方便,所以用C写东东比起C++来随手。为了使本人blog阐述的东东近于完善,在此就写下本人对C++类的一点点本质认识。在此再次重审:本人blog不代表本人现在真实水准。谁都要有点看家本事,否则在这社会上还真不好混,做为看家本事,一般是不外泄的哦。

本人在此不讨论理论上什么叫C++类(什么类代表汽车,鸭子的不会在此文中找到),在此只在机码层看看类到底是如何实现和运行的。

在这里我先定义一个测试用的类

class one{

public:

    one():a(10){}
    ~one(){}
    void seta(int a) { this->a = a;}
    int geta(void) { return a; }
    void setb(int b) { this->b = b;}
    int getb(void) { return b;}

private:

    int a,b;

};

接下来让我们定义一个类元素

one testone;

下面让我们看看定义的这个testone在内存中占多大

std::cout<<sizeof(testone)<<"\n";        //运行之后你会发现 testone在内存中只有8个字节 就是两个int的大小

在此我们完全可以认为 one 等同于

          struct{ 
                     int a; 
                     int b; 
                         }one;

如果你很想耍帅的话 你可以这样动态声明一个类     test* one = (one *)new int(2);

现在让我们再定义一个one元素 one testtwo; 同样testtwo的大小也是8字节。现在我们就有一个疑问喽,testone与testtwo大小相同但不是同一个实体,它们是如何和 one() ~one() seta() geta()等函数联系到一起的?

现在让我们在汇编级看看

       testone.seta(1);
00401098 6A 01                push        1
0040109A 8D 4D EC             lea         ecx,[ebp-14h]
0040109D E8 72 FF FF FF       call        @ILT+15(one::seta) (00401014)
       testtwo.seta(2);
004010A2 6A 02                push        2
004010A4 8D 4D E4             lea         ecx,[ebp-1Ch]
004010A7 E8 68 FF FF FF       call        @ILT+15(one::seta) (00401014)

我们发现 testone和testtwo调用它们各自的seta时用到同一个地址 00401014,在此可以肯定,同一个类one定义的元素共用类one定义的方法函数。

那么我们又可以推测出testone和testtwo的不同点是只有各自的int a\ int b 变量的地址不同了。在汇编码中我们又发现ebp - 14h和ebp - 1ch正好相差8字节。我的代码

one testone;
one testtwo;

定义的testone和testtwo是相挨着的,所以分内存时testtwo会紧跟testone之后。

在此我们可以总结一下了c++类的实现,编译器将

结构     struct{ 
                     int a; 
                     int b; 
                         }one;

一系列的函数方法

    one():a(10){}
    ~one(){}
    void seta(int a) { this->a = a;}
    int geta(void) { return a; }
    void setb(int b) { this->b = b;}
    int getb(void) { return b;}

自动进行了捆绑。这就好比生产线,生产设备是固定的,只是进出的零件在换罢了,而这些零件是事先处理(声明)后与此生产线相配的一套零件。

通过以上本人对c++类本质的简述,想毕各位可以很轻松的用c语言实现c++的类了吧(只要在加入结构与方法的固化就O了)。

在此本人在多述几句,功夫高手草朩皆兵,万物皆刃。编程注重的是思想不要固化在你所学的语言之上,要学会万化自然。

转载于:https://www.cnblogs.com/wangkangluo1/archive/2011/08/25/2153645.html

相关文章:

  • 【转】【翻译】Orx官方教程:4.(anim)动画
  • Android之Providing Resources(提供资源)
  • SAP ECC Web Dynpro ICM Config...
  • 算法之美:排序
  • 基于dedup技术的远程相似文件同步
  • 在Silverlight中对多个异步任务的调用
  • OGC标准介绍 4
  • POJ1991 Turning in Homework——贪心+动态规划——Pku1991
  • 在不影响页面内容的情况下来减少站点的页面输出量、增加页面的访问速度。...
  • c#缓存介绍(转)
  • SQL表达式结果集的小数精度
  • 随机取数据算法性能比较
  • 2010年7月微软最有价值专家(MVP)当选名单
  • 【海洋女神原创】安装导论--谨以此文与那些徘徊在安装的大门外,并且被花哨的功能所迷惑的朋友们共勉。...
  • 引用变量优化
  • CentOS 7 修改主机名
  • ComponentOne 2017 V2版本正式发布
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux Process Manage
  • node 版本过低
  • 猴子数据域名防封接口降低小说被封的风险
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端之React实战:创建跨平台的项目架构
  • 如何编写一个可升级的智能合约
  • 我从编程教室毕业
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #Java第九次作业--输入输出流和文件操作
  • #mysql 8.0 踩坑日记
  • (C++17) optional的使用
  • (javascript)再说document.body.scrollTop的使用问题
  • (笔试题)分解质因式
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (十六)Flask之蓝图
  • (原創) 未来三学期想要修的课 (日記)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bashrc在哪里,alias妙用
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 读取 JSON格式的数据
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net经典笔试题
  • .NET实现之(自动更新)
  • .Net小白的大学四年,内含面经
  • @Documented注解的作用
  • [ NOI 2001 ] 食物链
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [Android]创建TabBar
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素