zoukankan      html  css  js  c++  java
  • 类成员指针——偏移量

      成员指针只是记录一个成员的偏移量,而非地址,因为类中没有地址,选择一个类的成员只是意味着在类中偏移,只有把这个偏移和具体对象的首地址结合,才能得到实际地址。

      成员指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向一个特定对象的特定成员,最直接的理解是将其理解为一个偏移量。这个偏移量适用于某一类A的任何对象,换言之,如果一个A类对象的成员a距离起点的偏移量是4,那么任何其他A类对象中,a的偏移都是4字节。

    1. 类对象访问其成员时,是根据该成员在类中的偏移量来访问的。
    2. 类成员指针,可以理解为指向类数据成员的一个偏移量,而非地址。
    #include<stdio.h>
    #include<string.h>
    #include <iostream>
    using namespace std;
    class A
    {
    public:
        A() {m_a = 1; m_b = 2;}
        ~A() {}
        void fun() {printf("%d %d", m_a, m_b);}
    public:
        int m_a;
        int m_b;
    };
    class B
    {
    public:
        B() {m_c = 3;}
        ~B() {}
        void fun() {printf("%d", m_c);}
    public:
        int m_c;
    };
    int main()
    {
        A a;
        B *pb = (B*)(&a);
        pb->fun();             //1 m_a的值
        cout << &a << endl;          //0012FF6C 对象a的首地址
        cout << &(a.m_a) << endl;   //0012FF6C 对象成员m_a的首地址,也就是对象a的首地址
        cout << &(a.m_b) << endl;   //0012FF70
        printf("%p
    ",&A::a.m_a);   //00000000 偏移量
        printf("%p
    ",&A::a.m_b);   //00000004 偏移量
        printf("%p
    ",&B::a.m_c);   //00000000 偏移量
        cout << &A::a.m_a << endl;  //1 输出成员指针的值,最好使用printf,%p输出指针 
        cout << &A::a.m_b << endl;  //1 输出成员指针的值,最好使用printf,%p输出指针
        return 0;
    }

    输出成员指针的值,最好使用printf,%p输出指针!

    使用语句

    1
    cout<<&A::m_a<<&A::m_b;

    结果全是1。

      究其原因,应该是ostream对象没有重载类成员指针的参数,故不能直接输出类成员指针的类型,而我们知道指针类型与bool类型的转换属于标准转换的(常常用来测试指针合法性是否为空),而ostream对象可以输出bool类型,故编译器将成员指针类型转换成了bool类型,从而输出,既然这样为什么全是输出1呢?说明地址全是合法的,即偏移量全是大于0,不对呀,第一个类成员的偏移量不是0么,这里真心不明白,不过《C++必知必会》中有这样一句话:大多数编译器都将成员指针实现为一个整数,包含被指向成员的偏移量,另外加上1(加1是为了让值0可以表示一个空的数据成员指针。这大概就是全输出1的原因了吧。

  • 相关阅读:
    Mysql的ONLY_FULL_GROUP_BY
    Redis报错“ OOM command not allowed when used memory > 'maxmemory' ”
    redis发布订阅客户端报错
    使用IDEA远程调试SpringBoot程序
    kafk学习笔记(一)
    Ubuntu中卸载node和npm并重装
    一些常用的类型转换
    一台电脑配置多个GigHub账号
    百度网盘文件直接下载方法(跳过每次需要启动百度网盘下载的方式)
    如何激活IDEA工具,亲测有效
  • 原文地址:https://www.cnblogs.com/fuleying/p/4455518.html
Copyright © 2011-2022 走看看