我无法理解我用来学习C ++的书中的代码实际发生了什么。这是代码:
class Base
{
public:
Base() {};
virtual ~Base() {};
virtual Base* Clone() {return new Base(*this);}
};
class Derived
{
public:
Derived() {};
virtual ~Derived() {};
virtual Base* Clone() {return new Derived(*this);}
};
所以在这个Clone()
函数中我理解该函数返回一个指向Base类对象的指针。我不明白的是该功能正在发生什么。当我之前在new
中使用int *pInt = new int
时,我的印象是new
实际上在免费商店中为整数分配了足够的内存,然后返回该地址,应用地址指针pInt
。使用相同的逻辑,我试图理解代码的new Derived(*this)
部分。所以,我认为它是为Derived类对象在free store上分配足够的内存,并返回地址,然后由函数Clone()
返回。
为什么它通过构造函数传递*this
,如果它是构造函数?我理解*this
表示它传递了正在克隆的任何对象的地址,但我不理解class_name(address_of_an_object)
函数上下文中new
的语法。
有人可以解释一下这部分发生了什么吗?
提前致谢。
答案 0 :(得分:10)
误解就在这里:
*this
表示传递正在克隆的任何对象的地址
实际上,this
是要克隆的对象的地址,但*this
(注意星号)是解除引用该地址的结果。因此*this
属于Derived &
类型,它是对被克隆对象的引用,而不是其地址。
因此,调用new Derived(*this)
意味着在动态分配空间(new
之后)后,新空间由复制构造函数Derived(const Derived &)
初始化,在这种情况下,它不具有&# 39; t实际上是用户定义的,因此使用了(编译器生成的)默认版本的复制构造函数。
澄清new
的语义:如果C
是一个类,那么
new C;
为C
类型的对象分配足够的空间,然后调用C
的构造函数来初始化该空间。这是new
语义的一部分:它总是调用构造函数来初始化新分配的空间。
致电时
new C(a,b,c);
使用一些参数a
,b
和c
,然后new
将调用C
的构造函数来获取这三个参数。如果没有定义这样的构造函数,那么您将收到编译器错误。
现在在你打电话的特殊情况下
new C(a);
参数a
本身属于C&
类型,new
将一如既往地调用相应的构造函数。适当的构造函数是C(C &)
(如果已定义)或C(const C&)
(由编译器自动定义的复制构造函数)。