在以下情況下,每個成員都有不同的名稱或實體,爲什麼他們的地址相同?爲什麼班級成員與他們的對象具有相同的地址?
struct B { int x; };
struct A { B b; };
int main()
{
A obj;
cout << &obj.b.x << endl;
cout << &obj.b << endl;
cout << &obj << endl;
}
在以下情況下,每個成員都有不同的名稱或實體,爲什麼他們的地址相同?爲什麼班級成員與他們的對象具有相同的地址?
struct B { int x; };
struct A { B b; };
int main()
{
A obj;
cout << &obj.b.x << endl;
cout << &obj.b << endl;
cout << &obj << endl;
}
因爲指針的結構總是指向它的第一構件(與結構被佈置順序地)。
In C, does a pointer to a structure always point to its first member?
(C1X§6.7.2.1.13:「A指針的結構對象,適宜地轉換 ,點到它的初始構件...,反之亦然可能 是無名填充內,結構對象,而不是在其 開始「)
注:奶源指出,這是理所當然的,如果你開始添加虛函數到您的結構,C++通過黏合個實現此在你的struct開始的時候vtable ...這使得我的陳述(對C來說是真實的)在你談論你可能用C++中的'structs'做的所有事情時是不正確的。
考慮到'cout',它看起來比'C'多了'C++',所以通常指向結構的指針並不總是指向它的第一個成員。 (以防有人瀏覽你的鏈接,並沒有注意到它們之間的區別) – mange
廢話......結構在C中的工作方式與在C++中的工作方式相同...並且OP對cout的使用除了點。 – Steve
在'C++'中''struct'只是一個'class',默認訪問'public'而不是'private'。如果你添加一個具有虛函數的'struct',它將得到一個vtable指針,這將導致它違反上述屬性。 'cout'的使用表明它是'C++',而不是'C',因爲'C'沒有'cout'。 – mange
因爲他們是在同一個地方。在struct A
的第一個元素是struct B
,使他們在同一個存儲位置(在任何其他struct A
將隨後b
後放)實際上是。
同樣,x
是struct B
中的第一位數據,所以它的位置與struct B
相同。
注意,這不會永遠是真正的這是非常重要的。像虛擬功能這樣的東西會導致東西移動。在這種情況下是真的,因爲它們是普通的類/結構體。
+1「像虛擬功能一樣會引起東西移動。」 – Steve
如果站在你的國家的邊界與一杯咖啡在你的手那麼你的座標,邊界的座標和咖啡杯的座標都將有一個GPS設備上相同的值。
第一個孩子的第一個元素恰好是在對象的起始地址。名稱是爲了您自己的便利計算機使用內存地址。您可以隨意命名它們,但內存佈局取決於數據成員的順序和層次結構。
有趣的比喻... – Steve
可能是他們在同一類 –
因爲你的記憶看起來像 - 'class'es /'struct's是一個抽象的概念,編譯器可能已經優化了'struct's出來。 (這不是正確的答案,但需要考慮。) –