技术控

    今日:155| 主题:49136
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 深入探索C++对象模式读书笔记

[复制链接]
我受夠了等待 发表于 2016-9-30 16:18:55
76 1

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
       
  • 简单对象模式, object由很多slot组成, 每个slot( 指向member的指针 )指向一个memeber(包含数据成员和成员函数).   
  • 表格驱动对象模型, 将members相关信息分别放到data member table(持有data member)和member function table(member function的指针)中, class object本身包含指向两个表格的指针   
  • C++对象模型, 非静态数据成员配置在class object内, 静态数据成员存放在个别class object外.  
   C++对象模型之 虚函数 :
  
       
  • 每个 class(类) 产生一堆指向虚函数的指针, 放在virtual table( vtbl )中   
  • 每个 object(实例) 包含一个指针( vptr ), 指向相关的vitual table. vptr的设置和重置由class的构造/析构/拷贝赋值操作符完成 . 每个class的 type_info object (支持RTTI)也经由virtual table被指出来.  
   
深入探索C++对象模式读书笔记-1 (function,读书笔记,members,程序设计,虚函数)

  书中给出了一个struct和class结合使用的建议: 当要传递一个复杂的class object的全部或部分到C函数中, struct声明可以将数据封装起来, 并保证拥有与C兼容的空间布局.
  C++程序设计模型支持三种programming paradigms(编程范式):
  
       
  • 程序模型, 像C一样   
  • 抽象数据类型模型   
  • 面向对象模型  
  多态的主要用途是经由一个共同的接口来影响类型的封装, 这个接口通常被定义在一个抽象的base class中
  The Semantics of Constructors

  Default Constructor

  四种情况会造成编译器必须为未声明构造函数的 classes 合成一个 default constructor
  
       
  • 带有Default Constructor的Member Class . 如果class没有任何构造函数, 但包含一个 member object , 而后者有默认构造函数, 编译器会为该clas合成一个default constructor(只是为了满足编译器的需求). 如果class有默认构造函数, 且包含 member object , 则 编译器会扩张已存在的构造函数 .   
  • 带有Default Constructor的Base Class . 一个没有任何构造函数的class派生自一个带有default constructor的 base class, 这个派生类中的default constructor将会被合成.   
  • 带有一个Virtual Function的class . 默认构造函数正确的初始化每个class的vptr . class声明一个虚函数会合成默认构造函数   
  • 带有一个Virtual Base class的Class , class派生自一个继承链, 其中有一个或者更多virtual base classes  
  带有虚函数类在编译器:
  
       
  • 编译期一个virtual function table会被编译器产生, 内放class 的virtual functions地址   
  • 每个 class object 中, 一个额外的 pointer member(vptr) 被编译器合成出来, 内含相关与class vtbl的地址.  
  Copy Constructor

  [code]# 三个场景使用拷贝构造函数
classBase;
Base a;
Base b = a; //1. 显示拷贝
void(Base x);//2. object参数值传递
returnb;//3. 值传递的函数返回object
[/code]  
       
  • class未提供显式copy constructor时, 默认拷贝构造函数会把 内建或派生 的 data member 的值, 从某个object拷贝到另一个object上, 但不会拷贝其中的 member class object  
  Member Initialization List

  以下情况必须使用成员初始化列表:
  
       
  • 当初始化一个 reference member 时   
  • 当初始化一个 const member 时   
  • 当调用一个 base class 的 constructor, 而它拥有一组参数时   
  • 当调用一个 member class 的 constructor, 而它拥有一组参数时  
  
       
  • 初始化成员列表的顺序是由class中的members声明顺序决定的   
  • 调用 member function 设定一个member的初值可行, 因为与此object 相关的 this指针已经被建构妥当  
  [code]X::X(intval) :
i(xfoo(val)), // xfoo必须是 member function
j(val) {
}
[/code]  The Semantics of Data

  Data Member Layout

  
       
  • 非静态数据成员在class object的排列顺序和其被声明的顺序一样   
  • 静态成员函数 不会放入对象布局中, 会被放入 data segment  
  C++标准对布局持放任态度.
  Data Member get/set

  
       
  • static data member 在class object中存取不会招致任何空间或执行时间上的额外负担(静态数据成员不在class object内部)   
  • nonstatic data member 存放在 class object 内, 存取效率和 c struct member 或 nonderived class member 一样.  
  继承(非虚继承)不会不会增加空间和存取时间上的额外负担
  菱形继承的解决方案是导入虚拟继承

深入探索C++对象模式读书笔记-2 (function,读书笔记,members,程序设计,虚函数)

   虚继承的实现: class 如果内包含一个或多个 virtual base class subobjects , 将被分割成两部分: 一个不变区域和一个共享区域, 不变区域中的数据, 不管后继如何演化, 总有固定的offset用于直接存取, 共享区域只能被间接存取(在虚表中放置 virtual base class 的 offset)
  The Semantics of Function

  Nonstatic Member Functions

  C++设计准则之一: 非静态成员函数至少必须和一般的非成员函数有相同的效率.
  编译器将类的成员函数转换为非成员函数
  转换步骤:
  
       
  • 改写函数signature, 增加一个额外的参数(this)   
  • 将每一个 对 nonstatic data member 的存取操作 改为经过this指针存取   
  • 将 member function 重新谢伟一个外部函数(对函数名特殊处理. name mangling )  
  Virtual Member Functions

  多态: 以 public base class的指针(或引用) 寻址出一个 derived class object.
  
       
  • 一个类(不是对象)只有一个virtual table, 每个object被安插一个由编译器产生的指针(vptr).   
  • 派生的子类,会 overriding 一个可能存在的 base class virtual function实例  

12下一页
友荐云推荐




上一篇:React Native 启动白屏问题解决方案,教程
下一篇:ES proposal: global
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

未语、泪先流 发表于 2016-10-6 10:45:18
坐等楼主现身!
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表