4

我无法理解我用来学习 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()函数中,我理解该函数返回一个指向基类对象的指针。我不明白该函数中发生了什么。当我以前使用newas in 时int *pInt = new int,我的印象是new基本上在空闲存储上为整数分配了足够的内存,然后返回该地址,将地址应用于指针pInt。使用相同的逻辑,我试图理解new Derived(*this)代码的一部分。所以,我认为它在空闲存储上为 Derived 类对象分配了足够的内存,并返回地址,然后由函数返回Clone()

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

有人可以解释那部分发生了什么吗?

提前致谢。

4

1 回答 1

10

误会就在这里:

*this意味着它传递正在克隆的任何对象的地址

实际上,this是被克隆的对象的地址,但是*this(注意星号)是取消引用该地址的结果。*thistype 也是如此Derived &,它是对被克隆对象的引用,而不是它的地址。

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


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

new C;

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

你打电话时

new C(a,b,c);

带有一些参数a,bc, 然后new将调用一个带有C这三个参数的构造函数。如果没有定义这样的构造函数,你会得到一个编译器错误。

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

new C(a);

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

于 2013-02-06T01:36:45.157 回答