我需要一些帮助来理解我用来学习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);
答案 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)。