理解虚拟副本构造函数

时间:2013-02-06 01:30:54

标签: c++ class copy-constructor

我无法理解我用来学习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的语法。

有人可以解释一下这部分发生了什么吗?

提前致谢。

1 个答案:

答案 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);

使用一些参数abc,然后new将调用C的构造函数来获取这三个参数。如果没有定义这样的构造函数,那么您将收到编译器错误。

现在在你打电话的特殊情况下

new C(a);

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