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