C++的类成员指针是一种奇葩的指针。
假设现在我们要表示一个三维的点,现在有两种定义方式:
struct point1{ int x, y, z; }; struct point2{ int c[3]; };
第一种的优点是更直观,但第二种可以方便的用for遍历三个属性。最终我选择了第一种,但是我还想弄一个遍历功能怎么办?这个时候类成员指针就排上用场了,我们可以创建一个“指向point中具体成员的指针”。
int A:: *member = &A::x;
让member指针指向A中的成员x,且类型是int,此时我们就可以通过member来访问x:
point1 tmp{4, 5, 6}; cout << tmp.(*member); //把member解引用,得到tmp::x,表示要访问x
所以我们定义一个数组,就可以迭代访问类里的各种int属性了
int A:: *member [] = {&A::x, &A::y, &A::z}; for (int i = 0; i < 3; ++i) cout << tmp.(*member[i]);
这个用途也可以放到成员函数上,构建一个函数列表,顺序调用。
这么个指针的行为跟一般的指针显然不一样,它不保存地址,而是保存一个“偏移量”,从对象地址开头到对象成员的偏移量。这玩意其实可以输出:
struct A{ int a, b, c; }; main() { printf("%d%d%d", &A::a, &A::b, &A::c); //! 输入为0, 4, 8 //! 当然这玩意类型不是int,printf直接将他以int解析输出了,所以cout达不到效果 }
这样类成员指针的意义就很明显了,假设一个A的对象t,那么t的地址&t
和a的地址&(t.a)
是相等的,而&(t.b)
要多出来4,&(t.c)
又要多出来4。每个对象的内存构造都是一样的,这个类成员指针就是获取每个成员相对于头地址的偏移量,这样当我使用t.*member
编译器就知道是头地址+4处的变量,并且是个int。
不过成员函数又不太一样了。不同对象的成员函数只有同一份程序短代码。C++不能用&(t.fun)
的方式获取对象的成员函数的地址,要用取&A::fun
得到函数的地址。这个当然是真地址了。
类成员指针可以用于static
吗?显然不行,static成员单独存放,与类本身无关,取&A::staticmember
得到的就是这个变量的正经地址。那可以用于virtual function
吗?答案是可以,但是虚函数的地址无法确定,所以又变成了储存偏移量,实际上储存的是函数在虚表中的索引值。
上一个:Java中Scanner的方法
这一次的节点更新覆盖了新加坡、香港、美国、欧洲、日本、韩国、加拿大等地区,最高速度可达20.7 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
摘要: 本篇文章给大家谈谈哪里可以免费领养猫咪,以及哪里可以免费领养猫咪的猫对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、哪里可以领养猫?2、...
摘要: 本篇文章给大家谈谈深圳市领养宠物中心地址,以及深圳市领养宠物中心地址电话对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、深圳最大的宠物寄养中心在哪...
这一次的节点更新覆盖了香港、日本、美国、韩国、欧洲、加拿大、新加坡等地区,最高速度可达20.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
摘要: 今天给各位分享和田宠物医院污水处理价格多少的知识,其中也会对宠物店污水处理设备进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、宠物医院未配.
这一次的节点更新覆盖了欧洲、美国、日本、香港、加拿大、新加坡、韩国等地区,最高速度可达22.4 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
摘要: 本篇文章给大家谈谈宠物粮品牌起名字大全集图片及价格,以及宠物粮品牌名称对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、世界十大顶级狗粮品牌...
摘要: 本篇文章给大家谈谈违约养宠物还能退押金吗怎么处理,以及宠物店押金不退可以报警吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、领养宠物押金一年返还套路怎..
摘要: 本篇文章给大家谈谈动物诊疗许可证申领准备材料清单,以及动物诊疗许可证申领条件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、开宠物店需要办理哪些手续?具..
摘要: 今天给各位分享动物疫苗的种类及特点有哪些呢的知识,其中也会对动物疫苗的使用方法及注意事项进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、常.