C++ 这个指针构造函数是如何定义的?

C++ 这个指针构造函数是如何定义的?,c++,pointers,constructor,C++,Pointers,Constructor,我不明白下面的Animal(Animal*)构造函数是如何定义的。代码编译并正确运行 class Animal { public: virtual ~Animal() {} virtual std::string specie() = 0; virtual std::string family() = 0; }; class Rodent : public Animal { public: std::string family() override { retu

我不明白下面的
Animal(Animal*)
构造函数是如何定义的。代码编译并正确运行

class Animal {
public:
    virtual ~Animal() {}
    virtual std::string specie() = 0;
    virtual std::string family() = 0;
};

class Rodent : public Animal {
public:
    std::string family() override { return "rodent"; }
};

class Rabbit : public Rodent {
public:
    std::string specie() override { return "rabbit"; }
};

int main() {
    Animal* goffy(new Rabbit());
}

new Rabbit()
返回
Rabbit*
,通过继承,它是
Animal*
,因此构造函数将指针指向自身?

因为
goffy
是指针,它与

Animal* goffy = new Rabbit();

由于goffy是一个指针,它与

Animal* goffy = new Rabbit();
你在表演

表达式
newrabbit()
将返回一个
Rabbit*
。然后将该
Rabbit*
值转换为
Animal*
值,这是可能的,因为
Animal
Rabbit
的基类。然后将
Animal*
值分配到
goffy
变量中。

您正在执行的操作


表达式
newrabbit()
将返回一个
Rabbit*
。然后将该
Rabbit*
值转换为
Animal*
值,这是可能的,因为
Animal
Rabbit
的基类。然后将
Animal*
值赋给
goffy
变量。

可以使用复制构造函数复制指向对象的指针,就像堆栈上的普通对象一样。 然而,这里发生了两件事:

  • 首先,在堆上创建一个
    Deer
    对象,返回指向其地址的指针
  • 使用提供的复制构造函数创建
    Animal
    对象 默认情况下,编译器不会创建精确的副本,而是
    Deer
    对象正在被切片,因为
    Animal
    是它的基类

可以使用复制构造函数复制指向对象的指针,就像堆栈上的普通对象一样。 然而,这里发生了两件事:

  • 首先,在堆上创建一个
    Deer
    对象,返回指向其地址的指针
  • 使用提供的复制构造函数创建
    Animal
    对象 默认情况下,编译器不会创建精确的副本,而是
    Deer
    对象正在被切片,因为
    Animal
    是它的基类


您可能需要再次检查您发布的代码。鹿从来没有定义过;因此,我在主函数中得到了一个编译器错误。请显示Deer::Deer()的定义修复了输入错误,感谢他们的no
Animal(Animal*)
构造函数,也不需要任何构造函数。指针没有构造函数,它们是内置的。
Animal*goffy=newrabbit()可能看起来更容易理解?您可能需要仔细检查发布的代码。鹿从来没有定义过;因此,我在主函数中得到了一个编译器错误。请显示Deer::Deer()的定义修复了输入错误,感谢他们的no
Animal(Animal*)
构造函数,也不需要任何构造函数。指针没有构造函数,它们是内置的。
Animal*goffy=newrabbit()可能看起来更容易理解?所以它只是语法上的糖分?我不会称之为“糖分”,它只是语法上的规则性。通常首选不带
=
的形式,因为(无论如何,在C++17之前)它在与类一起使用时不会指定不必要的中间对象types@M.M.在c++17之前?我认为强制复制省略在每个人都认为它已经完成之前的位置?@rubenvb它指定在那些场景中甚至没有任何“复制”到elideSo它只是语法上的糖分?我不会称它为“糖分”,它只是语法上的规则性。没有
=
的形式通常是首选的,就像(无论如何在C++17之前)与类一起使用时,它不会指定不必要的中间对象types@M.M.在c++17之前?我认为强制复制省略在所有人都认为它已经完成之前在哪里?@rubenvb它指定在那些场景中甚至没有任何要删除的“副本”?这里是复制初始化?我在代码中只看到直接初始化。@CharlesBailey已修复。副本初始化在哪里?我在代码中只看到直接的初始化。@CharlesBailey已修复。