Я думаю, что первое, что нужно прояснить для вас, это понимание различия между классом против объектом . class - это чертеж, тогда как object - это экземпляр класса.
Итак, если вы не создаете экземпляр класса, то у вас ничего нет в памяти.
В первом случае напечатанные адреса совпадают, потому что вы создали один экземпляр,Имеет смысл иметь один и тот же адрес из-за наличия только одного объекта.
Во втором случае адреса различаются из-за наличия двух разных объектов (создаются два экземпляра класса), а не из-за использования&
.Таким образом, следующий код печатает те же адреса.
#include <iostream>
class A
{
public:
A() { std::cout << "Address with this pointer: " << this << std::endl; }
};
int main()
{
A a;
std::cout << "Address with & operator: " << &a << std::endl;
}
Редактировать: Почему представляет один и тот же адрес для подобъекта
Как я уже упоминал в комментариях, яникогда не слышал термин подобъект .Но я получил следующее определение от здесь .
подобъект: Любой объект, который хранится в другом объекте (элементы массива, объекты базового класса и объекты-члены данных).
Объект естественно занимает память, и любой подобъект объекта должен находиться где-то в этой памяти. первый созданный подобъект (с точки зрения порядка определения) получает первую часть памяти, второй созданный подобъект получает вторую часть памяти сразу после первого объектаи так далее.Итак, первый созданный подобъект имеет такой же начальный адрес с самим объектом.В следующем коде созданный первый объект является экземпляром класса A (поэтому A и C имеют одинаковый адрес) только потому, что Class A наследуется раньше, чем Class B .Если вы измените class C : public A, public B
на class C : public B, public A
, то объекты класса B и класса C будут одинаковыми.
#include <iostream>
class A
{
public:
A() { std::cout << "Address of Sub-Object A: " << this << std::endl; }
int x;
};
class B
{
public:
B() { std::cout << "Address of Sub-Object B: " << this << std::endl; }
int y;
};
class C : public A, public B {
public:
C() : A() , B() { std::cout << "Address of Object C: " << this << std::endl; }
int z;
};
int main()
{
C c;
}
PS: , если вы думаете о композиции, а не о наследовании,тогда это будет легче понять.