Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用*this与使用&;的基对象和派生对象的地址差异;操作人员_C++_Base_Derived_This Pointer - Fatal编程技术网

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副本(我是指地址不同的变量)


您有两个对象:ab

地址为0x7fff82c696de的a


地址为0x7fff82c696df的b有两个对象:ab

地址为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;
}