• Inside The C++ Object Model(一)


    ============================================================================
    1-1. 关键字struct和class的一点区别:
    (1)struct内部默认public属性,class内部成员默认private属性;
    (2)template中只能使用class来抽象类型参数,不能使用struct,template并不打算和C兼容。

    1-2. C程序员有时会把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。

    struct memble{
    /* */
    char pc[1];
    };

    在这里,如果我们改用class来声明,则可能不行。C++中凡处于同一个access section的数据,必定保证以其声明次序出现在内存布局当中。然而被放置在多个access sections(public,protected,private)中的各笔数据,排列次序就不一定了。同样道理,base classes和derived classes的data members的布局也没有谁先谁后的强制规定,因而也就不能保证前述的C伎俩一定有效。Virtual functions的存在也会使前述伎俩的有效性成为一个问号。最好的忠告就是:不要那么做。

    class stumble{
    public:
    // operations ...
    protected:
    // protected stuff
    private:
    /*private stuff*/
    char pc[1];
    };

    注:组合,而非继承,才是把C和C++结合在一起的唯一可行方法。C struct在C++中的一个合理用途,是当你要传递“一个复杂的class object的全部或部分”到某个C函数中去时,struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局。然而这项保证只在组合的情况下才存在。如果是“继承”而不是“组合”,编译器会决定是否应该有额外的data members被安插到base struct subobject之中。

    ============================================================================
    1-3. 你可以直接或间接处理继承体系中的一个base class object,但只有通过pointer或reference的间接处理,才支持OO程序设计所需要的多态性质。如下:

    // 描述objects:不确定类型
    Library_materials *px = retrieve_some_material();
    Library_materials &rx = *px;
    // 描述已知物:不可能有令人惊讶的结果产生
    Library_materials dx = *px;

    你没有办法确定地说出px或rx到底指向何种类型的objects,你只能够说它要不就是Library_materials object,要不就是后者的一个子类型(subtype)。不过,我们倒是可以确定,dx只能是Library_materials class的一个objects。


    ============================================================================
    1-4. C++对象模型(内存布局)

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

  • 相关阅读:
    删库了一定要跑路吗?爱情 36 技之记忆重生!
    程序员和他的朋友们!
    聊起 BigTable,让你不再胆怯
    [Ant Design] Warning: Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?
    Git 常用命令
    Git 名词解释
    js中void 0和undefined的区别
    js运算符优先级
    搭建React项目(低配版)
    mac常用shell指令笔记
  • 原文地址:https://www.cnblogs.com/yyxt/p/5995027.html
Copyright © 2020-2023  润新知