了解虚拟副本构造函数

understanding virtual copy constructors

本文关键字:构造函数 副本 虚拟 了解      更新时间:2023-10-16

我很难理解我用来学习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()函数中,我知道该函数返回指向基类对象的指针。我不明白的是该函数中发生了什么。当我以前使用 newint *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);

对于一些参数abc,那么new将调用接受这三个参数的C构造函数。如果未定义此类构造函数,则会收到编译器错误。

现在在特殊情况下,您调用

new C(a);

使用本身为 C& 类型的参数anew将一如既往地调用适当的构造函数。相应的构造函数是C(C &)(如果已定义(或C(const C&)(由编译器自动定义的复制构造函数(。