SWULWJ 2022-09-22 23:44 采纳率: 100%
浏览 80
已结题

如何理解int x:: *v[] = { &x::a,&x::b,&x::c };

如何理解“int x:: *v[] = { &x::a,&x::b,&x::c };”
以及func()方法的底层逻辑?

#include <iostream>
using namespace std;

class x
{
public:
    int a, b, c;
    x() { a = b = c = 0; };
    x(int i) { a = i; b = c = 0; };

};

int x:: *v[] = { &x::a,&x::b,&x::c };

void func(x *a, int x:: *b, int c) {

    a->*b = c;
}

int main() {

    x a(1), b(304);
    x *c = new x(-13);

    f(&a, v[0], 3);
    f(&b, v[1], 2);
    f(c, v[2], 1);
    cout << a.a << " " << b.b << "" << c->c;
    return 0;
}
  • 写回答

2条回答 默认 最新

  • _GX_ 2022-09-23 04:05
    关注
    #include <iostream>
    
    using namespace std;
    
    class x {
    public:
      int a, b, c;
      x() { a = b = c = 0; };
      x(int i) {
        a = i;
        b = c = 0;
      };
    };
    
    // 下面语句的意思是,定义一个指向x类中int类型非静态数据成员的指针数组,并初始化。
    // 指向非静态数据成员的指针,和其他类型指针不同,它不能强制转化成其他指针,
    // 也不支持指针运算和解引用,它只能通过->*或.*运算符使用。
    // 大多数编译器使用非静态数据成员在类/结构体中的偏移量来实现这类指针
    // https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_members
    int x::*v[] = {
        &x::a, // &x::a返回的是数据成员a在x中的偏移,结果是0
        &x::b, // &x::b返回的是数据成员b在x中的偏移,结果是4
        &x::c  // &x::c返回的是数据成员c在x中的偏移,结果是8
    };
    
    void func(x *a, int x::*b, int c) {
      // ->*和.*是指向成员指针访问运算符,下面语句等价于(*a).*b = c;
      // ->*左边必须是对象指针,.*左边必须是对象
      // 表达式a->*b运算的结果是,在a所指对象中b指针(偏移量)所指的数据成员
      // 底层实现就是通过对象基址a加上偏移量b获得数据成员实际地址,然后对这个地址上的数据成员赋值
      // https://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_pointer-to-member_access_operators
      a->*b = c;
    }
    
    int main() {
      x a(1), b(304);
      x *c = new x(-13);
    
      func(&a, v[0], 3); // 等价于a.a = 3
      func(&b, v[1], 2); // 等价于b.b = 2
      func(c, v[2], 1);  // 等价于c.c = 1
      cout << a.a << " " << b.b << " " << c->c;  // 输出3 2 1
      return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 修改了问题 9月23日
  • 创建了问题 9月22日

悬赏问题

  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题