C++ 使用*this与使用&;的基对象和派生对象的地址差异;操作人员
有人能解释一下为什么在使用这个指针和&运算符时,基址和派生对象的地址会有差异吗。下面是我的代码C++ 使用*this与使用&;的基对象和派生对象的地址差异;操作人员,c++,base,derived,this-pointer,C++,Base,Derived,This Pointer,有人能解释一下为什么在使用这个指针和&运算符时,基址和派生对象的地址会有差异吗。下面是我的代码 #include <iostream> using namespace std; class A { public: A() { cout<<"Base Address "<<this<<endl; } }; class B:public A { public: B()
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"Base Address "<<this<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"Deri Address "<<this<<endl;
}
};
int main()
{
B b;
}
The O/P is
Base Address 0x7fff500e9bdf
Deri Address 0x7fff500e9bdf
现在我可以清楚地看到地址不同了
a) 造成这种差异的原因是什么b) 我想知道的另一件事是,派生类中的基子对象是否与基对象完全相同?我对此感到困惑,因为如果我们在一个基类中说,如果我们有一个变量x,如果我们有一个基类的派生类(非多态情况),那么如果我们现在谈论派生类中的基子对象,基类中的x是否也存在于派生类的基子对象中(我是指派生的基和基子对象中地址相同的变量)或者派生的基和基子对象中都有一个单独的x副本(我是指地址不同的变量)
您有两个对象:a和b: 地址为0x7fff82c696de的a
地址为0x7fff82c696df的b有两个对象:a和b: 地址为0x7fff82c696de的a
地址为0x7fff82c696df的b为什么你会得到你所看到的?这是因为
a!=b
您可以创建两个对象:
A a;
B b;
如果您将另一个参数添加到类A的构造函数中,它将被清除
class A
{
public:
A(std::string name)
{
cout<<name<<"'s Base Address "<<this<<endl;
}
};
现在您的输出将如下所示
b's Base Address 0x7fff82c696df
b's Deri Address 0x7fff82c696df
a's Base Address 0x7fff82c696de
a: 0x7fff82c696de
b: 0x7fff82c696df
现在您可以看到&运算符和*this
的结果是相等的。您只是有两个不同的对象,当然,有两个不同的地址。
您还可以看到,对于派生类B
,这个
在B
s和A
s构造函数中具有相同的值。为什么您会得到您所看到的?这是因为A!=B
您可以创建两个对象:
A a;
B b;
如果您将另一个参数添加到类A的构造函数中,它将被清除
class A
{
public:
A(std::string name)
{
cout<<name<<"'s Base Address "<<this<<endl;
}
};
现在您的输出将如下所示
b's Base Address 0x7fff82c696df
b's Deri Address 0x7fff82c696df
a's Base Address 0x7fff82c696de
a: 0x7fff82c696de
b: 0x7fff82c696df
现在您可以看到&运算符和*this
的结果是相等的。您只是有两个不同的对象,当然,有两个不同的地址。
您还可以看到,对于派生类B
,这个在B
s和A
s构造函数中具有相同的值。我认为首先要澄清的是理解类和对象之间的区别。类是一个蓝图,而对象是该类的一个实例
因此,如果不创建该类的实例,那么内存中就没有任何内容
在第一种情况下,打印的地址是相同的,因为您创建了一个实例。因为只有一个对象,所以具有相同的地址是有意义的
在第二种情况下,地址不同是因为有两个不同的对象(创建了两个类实例),而不是因为使用了&
。因此,下面的代码打印相同的地址
#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;
}
PS:如果你考虑组合而不是继承,那么它可能更容易理解。我想首先要澄清的是,你要理解类与对象之间的区别。类是一个蓝图,而对象是这个班
因此,如果不创建该类的实例,那么内存中就没有任何内容
在第一种情况下,打印的地址是相同的,因为您创建了一个实例。因为只有一个对象,所以具有相同的地址是有意义的
在第二种情况下,地址不同是因为有两个不同的对象(创建了两个类实例),而不是因为使用了&
。因此,下面的代码打印相同的地址
#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;
}
PS:如果您考虑的是组合而不是继承,那么它可能更容易理解。这
指向的对象实例不是“类型”。由于您有两个对象的实例a
和b
,因此有两个不同的此
值,每个对象一个。我想知道为什么您会感到奇怪?基本子对象是什么意思?基本子对象是指派生对象的基本部分。我不明白的是,这个*包含对象地址,为什么它与我们使用&运算符打印对象地址时的地址不同?不,它不会因为&而不同,因为它们是不同的对象。@MarekR,如果您观察第一次输出时如果我们在构造函数中使用此*打印基地址和派生地址,则基地址和派生地址的值都相同。每个对象没有两个不同的此值。这两个对象的值都相同。所以我现在感到困惑。此
指向对象的实例,而不是“type”。由于您有两个对象的实例a
和b
,因此有两个不同的此
值,每个对象一个。我想知道为什么您会感到奇怪?基本子对象是什么意思?基本子对象是指派生对象的基本部分。我不明白的是,这个*包含对象地址,为什么它与我们使用&运算符打印对象地址时的地址不同?不,它不会因为&而不同,因为它们是不同的对象。@MarekR,如果您观察第一次输出时如果我们在构造函数中使用此*打印基地址和派生地址,则基地址和派生地址的值都相同。每个对象没有两个不同的此值。两个对象的值都相同。因此,我现在感到困惑。感谢您的输入。关于您的评论“在第一种情况下,打印的地址是相同的becau
#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;
}
#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;
}