zoukankan      html  css  js  c++  java
  • 用一个指向int的指针来存储一个对象的地址。

    #include <iostream>
    using namespace std;

    class Class
    {
    public:
     virtual void fun()
     {
      cout << "Class::fun" << endl;
     }
    };

    int main()
    {
     Class objClass;
     cout << "Size of Class = " << sizeof(objClass) << endl;
     return 0;
    }

    Size of Class = 4

    #include <iostream>
    using namespace std;

    class Class
    {
    public:
     virtual void fun1()
     {
      cout << "Class::fun1" << endl;
     }
     virtual void fun2()
     {
      cout << "Class::fun2" << endl;
     }
     virtual void fun3()
     {
      cout << "Class::fun3" << endl;
     }
    };

    int main()
    {
     Class objClass;
     cout << "Size of Class = " << sizeof(objClass) << endl;
     return 0;
    }

    Size of Class = 4

    #include <iostream>
    using namespace std;

    class CPoint
    {
    public:
     int m_ix;
     int m_iy;
     virtual ~CPoint()
     {
     } // 译注:原文此处有分号,我将其去掉,下皆同
    };

    int main()
    {
     CPoint objPoint;
     cout << "Size of Class = " << sizeof(objPoint) << endl;
     return 0;
    }

    Size of Class = 12

    这些程序的输出表明,当你向类中添加了虚函数之后,那么它的尺寸就会增加一个int的大小。 在Visual C++中也就是增加4个字节。这就意味着这个类中有三个整数大小的位置, 一个是x,一个是y,另一个是处理虚函数用的虚函数表指针

    #include <iostream>
    using namespace std;

    class CPoint
    {
    public:
     int m_ix;
     int m_iy;
     CPoint(const int p_ix = 0, const int p_iy = 0) :
      m_ix(p_ix), m_iy(p_iy)
     {
     }
     int getX() const
     {
      return m_ix;
     }
     int getY() const
     {
      return m_iy;
     }
     virtual ~CPoint()
     {
     }
    };

    int main()
    {
     CPoint objPoint(5, 10);

     int* pInt = (int*) &objPoint;
     *(pInt + 0) = 100; // 企图改变x的值
     *(pInt + 1) = 200; // 企图改变y的值

     cout << "X = " << objPoint.getX() << endl;
     cout << "Y = " << objPoint.getY() << endl;

     return 0;
    }

    这个程序中最重要的东西是:

    int* pInt = (int*)&objPoint;
      *(pInt+0) = 100; // 企图改变x的值
      *(pInt+1) = 200; // 企图改变y的值
    

    其中,我们在把对象的地址存入一个整型指针之后,就可以把这个对象看作一个整型的指针了。程序的输出为:

    X = 200
    Y = 10

    当然,这并不是我们想要的结果,它表明200存储在了m_ix数据成员的位置。这就意味着m_ix,也就是第一个成员变量,是起始于内存中第二个位置的,而不是第一个。换句话说,第一个成员是虚函数表指针,其它的才是对象的数据成员。那么,只需要修改以下的两行:

    int* pInt = (int*)&objPoint;
    *(pInt+1) = 100; // 企图改变x的值
    *(pInt+2) = 200; // 企图改变y的值
    

    X = 100
    Y = 200

  • 相关阅读:
    在不给spring管理的类中获取类
    poi操作excel
    闭包
    输入url的过程发生了什么?
    跨域
    函数节流-防抖函数
    预解析-案例
    移动端适配方案
    实现元素水平居中和垂直居中的几种方法
    css小知识点
  • 原文地址:https://www.cnblogs.com/byfei/p/3112229.html
Copyright © 2011-2022 走看看