理解虚拟副本构造函数

Ein*_*rDS 4 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);}
};
Run Code Online (Sandbox Code Playgroud)

所以在这个Clone()函数中我理解该函数返回一个指向Base类对象的指针.我不明白的是该功能正在发生什么.当我以前使用new过时int *pInt = new int,我的印象是new基本上在免费存储上为整数分配足够的内存,然后返回该地址,将地址应用于指针pInt.使用相同的逻辑,我试图理解new Derived(*this)代码的一部分.所以,我认为它是在Derived类对象的免费存储上分配足够的内存,并返回该函数返回的地址Clone().

但是,为什么它会*this通过构造函数,如果它是构造函数?我理解*this它意味着它传递任何被克隆对象的地址,但我不理解函数class_name(address_of_an_object)上下文中的语法new.

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

提前致谢.

jog*_*pan 10

误解在这里:

*this 表示它传递正在克隆的任何对象的地址

实际上,this是正在克隆的对象的地址,但*this(注意星号)是解除引用该地址的结果.所以*this是类型Derived &,它是对被克隆对象的引用,而不是它的地址.

因此,调用new Derived(*this)意味着在动态分配空间之后(这是什么new),新空间由复制构造函数初始化Derived(const Derived &),在这种情况下实际上并没有用户定义,因此(编译器生成的)默认版本的使用了复制构造函数.


澄清语义new:如果C是一个类,那么

new C;
Run Code Online (Sandbox Code Playgroud)

为类型的对象分配足够的空间C,然后调用构造函数C初始化该空间.这是语义的一部分new:它总是调用构造函数来初始化新分配的空间.

你打电话的时候

new C(a,b,c);
Run Code Online (Sandbox Code Playgroud)

有一些参数a,b并且c,然后new将调用构造函数C是需要这三个参数.如果没有定义这样的构造函数,则会出现编译器错误.

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

new C(a);
Run Code Online (Sandbox Code Playgroud)

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

  • _new_总是调用构造函数._new Derived()_调用默认构造函数,_new Derived(1,2)_调用构造函数_(int,int)_ - 不存在 - 和_new Derived(*this)_正在调用隐式复制构造函数.每次你有一个_ClassName类型的构造函数(const ClassName&)_它是一个复制构造函数,如果你传递_ClassName_的一个对象来构造_ClassName_的另一个对象,它将被复制. (3认同)