• Inside The C++ Object Model(五)


    ============================================================================
    5-0. 一般而言,class 的data member 应该被初始化,并且只在constructor中是在class 的其他member functions 中指定初值。其他任何操作都将破坏封装性质,是class 的维护和修改更加困难。


    图片5-0;

    (1)纯虚拟函数的存在
    注:编译器不会在扩展derived class 的destructor时停止对pure Virtual destructor的调用操作(因为class设计者可能真的定义了一个pure Virtual destructor);编译器也不会自己取合成一个pure Virtual destructor的函数定义(编译器没有足够的知识,因为编译器对一个可执行文件采取“分离编译模型”)。
    一个比较好的替代方案就是,不要把Virtual destructor 声明为pure。

    (2)虚拟规格的存在
    一般而言,把所有的成员函数都声明为Virtual function,然后再靠编译器的优化操作把非必要的Virtual invocation 去除,并不是好的设计观念。

    (3)虚拟规格中const的存在
    不把函数声明为const,意味着该函数不能够获得一个const reference 或 const pointer。比较令人头大的是,声明一个函数为const,然后才发现其derived instance 必须修改某一个data member。简单想法:不再用const就是了。

    (4)重新考虑class 的声明


    图片5-0-1;


    ============================================================================
    5-1. “无继承”情况下的对象构造


    图片5-1-1;

    (1)抽象数据类型
    如果要对class 中的所有成员都设定常量初值,那么给予一个explicit initialization list 会比较高效(比起意义相同的constructor 的 inline expansion(内联扩展)而言)。甚至在local scope中也是如此。


    图片5-1-2;

    观念上,我们的Point class 有一个相关的default copy constructor、copy operator和destructor,然而它们都是无关痛痒的,而且编译器实际上根本没有产生它们。

    (2)为继承做准备
    继承下的多态决议,Virtual functions的引入,每一个class object 多负担一个vptr,并且也引发编译器对于我们的class 产生膨胀作用:


    图片5-1-3;

    注:C++ Standard 要求编译器尽量延迟 nontrivial members 的实际合成操作,直到真正遇到其使用场合为止。


    ============================================================================
    5-2. 继承体系下的对象构造


    图片5-2-1;


    图片5-2-2;

    (1)虚拟继承
    问题:对于Virtual base class 的构造,由更往后(往下)的继承来负责“被共享之virtual base class(派生类的subobject)”的构造。
    添加条件测试:只有一个完整的class object 被定义出来时,它才会被调用;如果object只是某个完整object 的subobject,它就不会被调用。


    (2)vptr初始化语意学
    如下的继承体系:


    图片5-2-3;


    图片5-2-4;


    图片5-2-5;


    图片5-2-6;

    然而,这个看似完美的解决有关限制虚拟机制的问题,却仍不完美:

    图片5-2-7;


    图片5-2-8;


    ============================================================================
    5-3. 对象复制语意学


    图片5-3-1;


    图片5-3-2;


    图片5-3-3;

    注:书中作者建议,尽可能不要允许一个virtual base class 的拷贝操作。甚至:不要在任何virtual base class 中声明数据。


    ============================================================================
    5-5. 解构语意学


    图片5-5-1;


    图片5-5-2;


    图片5-5-3;


    ============================================================================

  • 相关阅读:
    蛇形填数字 (附书上例题答案)
    排列 (C++实现)
    分数化小数(C++)
    Operating System 1.2 什么是操作系统
    Python知识点入门笔记——基本控制流程
    Python知识点入门笔记——基本运算和表达式
    Python知识点入门笔记——Python的基本数据类型
    网络架构遵循原则
    浏览器输入网址后发生了这些
    JAVA解析XML有哪几种方法?并简述各自的优缺点
  • 原文地址:https://www.cnblogs.com/yyxt/p/5995124.html
Copyright © 2020-2023  润新知