C++ 为什么类成员与其对象具有相同的地址?
在以下情况下,每个成员都有不同的名称或实体,为什么他们的地址相同C++ 为什么类成员与其对象具有相同的地址?,c++,C++,在以下情况下,每个成员都有不同的名称或实体,为什么他们的地址相同 struct B { int x; }; struct A { B b; }; int main() { A obj; cout << &obj.b.x << endl; cout << &obj.b << endl; cout << &obj << endl; } 结构B{intx;}; 结构A{B
struct B { int x; };
struct A { B b; };
int main()
{
A obj;
cout << &obj.b.x << endl;
cout << &obj.b << endl;
cout << &obj << endl;
}
结构B{intx;};
结构A{B;};
int main()
{
obj;
cout因为指向结构的指针总是指向它的第一个成员(因为结构是按顺序排列的) (C1x§6.7.2.1.13:“适当地,指向结构对象的指针 已转换,指向其初始成员…反之亦然。可能 在“作为结构对象”中使用未命名的填充,但不能在其 开始。”)
<强>注释:曼奇指出,如果你开始向你的结构中添加虚拟函数,C++通过在结构的开始处对VTALE进行跟踪来实现这一点…这使得我的语句(对于C来说是正确的)当你谈论C++中的“结构”时,你可能会犯错误。
因为它们在同一个地方。x
是struct B
中的第一位数据,因此它与struct B
的位置相同
非常重要的是要注意,这并不总是正确的。像虚拟函数这样的东西会导致东西移动。在这种情况下是正确的,因为它们是普通的类/结构。如果你站在你国家的边界上,手里拿着一杯咖啡,那么你的坐标,边界坐标和咖啡的坐标cup在GPS设备上的值都相同
第一个子元素的第一个元素恰好位于对象的起始地址。名称是为了方便计算机使用内存地址。您可以随意命名它们,但内存布局取决于数据成员的顺序和层次结构。可能它们在同一个类中,因为您的内存看起来像-
class
es/Cuth>结构> /Calp> S是一个抽象概念,编译器可以优化