zoukankan      html  css  js  c++  java
  • 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++对象模型(内存布局)

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

  • 相关阅读:
    css实现图像边框的样式
    css3 实现div靠右对齐
    将div水平,垂直居中的方式
    使用vue-cli可视化的方式创建项目后如何关闭ESLint代码检测
    清楚html和css标签自带默认样式
    vue动态请求到的多重数组循环遍历,取值问题,如果某个值存在则显示,不存在则不显示。
    python 编程
    python 错题集
    python+selenium页面自动化 元素定位实际遇到的各种问题(持续更新)
    使用Fiddle抓取IOS手机
  • 原文地址:https://www.cnblogs.com/yyxt/p/5995027.html
Copyright © 2011-2022 走看看