zoukankan      html  css  js  c++  java
  • C++对象模型:成员变量<一>非静态成员变量

    非静态成员变量,分别两种可能,要么类自定义,要么继承而来。根据《深度探索C++对象模型》的解读。

    class X
    {
        private:
        int x,y,z;
    };

    在这个类中,有三个私有成员变量(不管私有,保护,或公有),都按照某个次序排列(一般根据定义的先后顺序),唯一需要注意的是:某些变量需要对齐填充。在内存中的排列次序依次为:x,y,z;
    假如需要对这三个变量进行操作,实际会在成员函数中填充一个指针,参照《深入浅出MFC》。

    class X
    {
        public:
        void f()/*此处填充,得到:void f((X*)this)*/
        {
            x++;/*等价于this->x++;*/
        }
        private:
        int x,y,z;
    };

    那么,如何得到成员变量x的地址呢?采用:对象首址+offset(x),也就是首址+成员变量的偏移量,合成得到成员变量的地址。

    第二种情况:经过继承得到的成员变量。形式相同,一样的把继承过来的成员变量加到对象的成员变量的内存块中,又会出现次序的问题。书上的解答为:一般情况下,继承的排在前面,派生类排在后面(这个通过程序得到了验证)。

    一、为什么空类的sizeof大小为1?
    隐藏有1字节,是被编译器安插进去的一个char型,使得这个类的两个object有独一无二的地址。
     
     
     
     
     
     
     
     
  • 相关阅读:
    Spring Boot拦截器实现并和swagger集成后使用拦截器的配置问题
    .Net
    Spring+MyBatis实现数据库读写分离方案
    JS通过百度地图API获取当前定位信息
    DevExpress安装说明
    sql server 多行数据合并成一列
    sql数据行转列
    html居中定位
    c#使用多线程的几种方式示例详解
    sql server数据字符串分割功能sql
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5348882.html
Copyright © 2011-2022 走看看