了解虚拟副本构造函数
understanding virtual copy constructors
我很难理解我用来学习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()
函数中,我知道该函数返回指向基类对象的指针。我不明白的是该函数中发生了什么。当我以前使用 new
如 int *pInt = new int
时,我的印象是new
基本上在免费存储上为整数分配了足够的内存,然后返回该地址,将地址应用于指针pInt
。使用相同的逻辑,我试图理解代码的new Derived(*this)
部分。因此,我认为它是在免费存储区上为派生类对象分配足够的内存,并返回地址,然后由函数 Clone()
返回。
是构造函数,为什么它会通过构造函数传递*this
?我知道*this
意味着它传递正在克隆的任何对象的地址,但我不明白new
函数上下文中class_name(address_of_an_object)
的语法。
有人可以解释一下那部分发生了什么吗?
提前谢谢。
误解就在这里:
*this
表示它传递正在克隆的任何对象的地址
实际上,this
是要克隆的对象的地址,但*this
(注意星号(是取消引用该地址的结果。所以*this
是类型 Derived &
,它是对被克隆对象的引用,而不是它的地址。
因此,调用new Derived(*this)
意味着在动态分配空间(这是new
所做的(之后,新空间由复制构造函数Derived(const Derived &)
初始化,在这种情况下,它实际上不是用户定义的,因此使用(编译器生成的(复制构造函数的默认版本。
为了澄清new
的语义:如果C
是一个类,则
new C;
为 C
类型的对象分配足够的空间,然后调用 C
的构造函数来初始化该空间。这是new
语义的一部分:它总是调用构造函数来初始化新分配的空间。
当您致电时
new C(a,b,c);
对于一些参数a
、b
和c
,那么new
将调用接受这三个参数的C
构造函数。如果未定义此类构造函数,则会收到编译器错误。
现在在特殊情况下,您调用
new C(a);
使用本身为 C&
类型的参数a
,new
将一如既往地调用适当的构造函数。相应的构造函数是C(C &)
(如果已定义(或C(const C&)
(由编译器自动定义的复制构造函数(。
- 如何从构造函数副本 T(const T&)调用对象 T?
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 复制构造函数生成旧数组的错误副本
- 复制构造函数和运算符"="他们没有打印列表 l 的副本
- 是否可以编写便于副本初始化的显式构造函数
- 该代码调用副本或移动构造函数
- 我应该声明我的异常的副本构造函数noexcept吗
- 复制构造函数不起作用,无法修改副本
- C++中的构造函数副本、列表、指针和模板
- 具有未定义参数的私有副本构造函数
- 构造函数初始化列表中的 C 结构副本C++
- 使用函数中的复制构造函数创建实例的副本,该函数获取作为基对象传递的实例
- 错误的数组初始化与赋值副本构造函数初始化
- 如何制作此构造函数的深层副本
- 为二进制搜索树副本构造函数编写辅助函数
- 在循环构造函数调用中创建的对象的副本
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- C++通过对构造函数的引用传递.成员将是一个完整的私人副本
- 如果引发的异常始终是异常对象的副本,为什么不调用此复制构造函数?
- 模拟虚拟副本构造函数