使用此指针分配内存

时间:2014-01-04 03:16:02

标签: c++ class memory this

我需要一些帮助来理解我用来学习C ++的书中的代码。

Class Fish
{
public:
    virtual Fish* Clone() = 0; //pure virtual function
};

Class Tuna: public Fish
{
public:
    Tuna* Clone() //virtual clone function
    {
        return new Tuna(*this);
    }
};

该部分实际上是在寻找一种在C ++中绕过非限制虚拟拷贝构造函数的方法。但是,我只是无法绕过

return new Tuna(*this);

语句。顺便说一句,我理解以下代码。

int* ptr;
ptr = new int[6];

这会将6个int的块分配给指针。

 new Tuna();

只会分配一个指向一个位置的指针,该位置有足够的空间来容纳第一个代码片段中的Tuna类。但是,这个指针的取消引用是什么意思? This指针指向对象吗?因此解除分配它会揭示对象内存位置的内容吗?这如何与

相关联
new int[6];

new Tuna(*this);

3 个答案:

答案 0 :(得分:3)

Tuna有一个复制构造函数,即使它是编译定义的。

您正在动态分配新的Tuna实例,方法是将引用传递给当前实例,然后从该进行复制。

    new Tuna(*this);
//   ^    ^    ^
//   |    | ref to current
//   |    |  instance as
//   |    |    argument
//   |    | 
//   | copy ctor
//   |   plz!
//  dynamic
// allocation

被调用的复制构造函数如下所示:

Tuna(const Tuna& other);

*this为您提供了一个代表当前Tuna左值,它可以快速绑定到此参考参数。

简而言之,这个表达式正是函数名称所暗示的:它克隆当前对象。

这是以下声明的动态分配等价物:

Tuna gimmeMoreTuna(*this);

new int[6]坦率地与它无关。


  

new Tuna();只会分配一个指向某个位置的指针,该位置有足够的空间来容纳第一个代码段中的Tuna类

不,它也会调用默认的Tuna构造函数。这就是你所缺少的。

答案 1 :(得分:1)

new Tuna(*this);

这与调用Tuna的复制构造函数通过引用传递变量相同。您需要记住,如果您不提供复制构造函数,编译器将自动为您提供一个。像这样的东西; Tuna(const Tuna& var)。因此,在这种情况下,取消引用this指针会将它所引用的实例作为参数传递给刚刚调用new分配的实例的复制构造函数。

您可以将new int[6]视为调用int类的默认构造函数6次并将它们分配到连续的内存位置。

答案 2 :(得分:0)

C ++默认将复制构造函数添加到类中。所以

new Tuna(*this)

表示分配Tuna的内存并将其内容复制到“新”金枪鱼。取消分配这不会影响“新”金枪鱼,除了在金枪鱼类中有ptr,例如

class Tuna 
{
    int* someArray;
    public Tuna()
    {
        someArray = new int[16];
    }
}

在这种情况下,你需要自己定义复制构造函数来复制数组的内容(someArray here)。