![](/img/trans.png)
[英]Why we have to mention data type in front of address of the object to access the private members of a class in C++?
[英]Why do class members have the same address as their object?
在以下情况下,每个成员都有不同的名称或实体,那么为什么他们的地址相同?
struct B { int x; };
struct A { B b; };
int main()
{
A obj;
cout << &obj.b.x << endl;
cout << &obj.b << endl;
cout << &obj << endl;
}
因为指向结构的指针始终指向其第一个成员(因为该结构是按顺序排列的)。
(C1x第6.7.2.1.13节:“经过适当转换的指向结构对象的指针指向其初始成员……反之亦然。在作为结构对象的内部可能有未命名的填充,但在其开始处没有。”)
注意: mange正确地指出,如果您开始向结构中添加虚拟函数,则C ++通过在结构的开头添加vtable来实现此目的……这使我的声明(对于C是正确的)在您使用时不正确讨论您可以在C ++中使用“结构”进行的所有操作。
因为他们在同一个地方。 struct A
的第一个元素是struct B
,因此它们实际上位于相同的内存位置(然后, struct A
其他任何内容都将放在b
之后)。
同样, x
是struct B
中数据的第一位,因此它与struct B
处于同一位置。
需要特别注意的是,这并不总是正确的。 诸如虚拟功能之类的事物将导致事物移动。 在这种情况下是正确的,因为它们是简单的类/结构。
如果您手持一杯咖啡站在您国家的边界,那么您的坐标,边界坐标和咖啡杯的坐标在GPS设备上都将具有相同的值。
第一个孩子的第一个元素碰巧在对象的起始地址。 名称是为了方便您使用,计算机使用内存地址。 您可以随意命名,但内存布局取决于数据成员的顺序和层次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.