2015-07-20 104 views
1

我是C++的新手,刚读书读书。 所以这个问题可能有点愚蠢。 这里是我的程序:模拟一个虚拟拷贝构造函数

#include <iostream> 
using namespace std; 

class Fish 
{ 
public: 
    virtual Fish* Clone() = 0; 

}; 

class Tuna : public Fish 
{ 
public: 
     Tuna(const Tuna& SourceTuna) 
    { 
     cout << "Copy Constructor of Tuna invoked" << endl; 
    } 


    Tuna* Clone() 
    { 
     return new Tuna(*this); 
    } 
}; 

我有

问题
return new Tuna(*this); 

首先,为什么拷贝构造函数返回金枪鱼的指针? 通常,调用复制构造函数将直接返回一个复制的实例。 例如:

class Student 
{ 
public: 
    Student(){} 
    Student(const Student& Input) { cout << "Copy Ctor Invoked\n"; } 
}; 

int main() 
{ 
    Student a; 
    Student b(a); 
    return 0; 
} 

此基础上我的理解,是什么Student b(a);确实是抄袭的实例,并命名为b。 那么为什么new Tuna(*this)不是返回一个实例而不是一个指针?

二,为什么是这个点,即。 *this,在参数中提供? 根据我的理解,this是一个指向当前对象的指针,这意味着*this是一个指向当前对象指针的指针。我尝试使用int来模拟这种情况。

// The input argument is the same as a copy constructor 
int SimulateCopyConstructor(const int& Input){ return 0; } 

void main() 
{ 
    int a = 10;  // a simulate an object 
    int* b = &a; // b is a pointer of object a, which simulate "this" 
    int** c = &b; // c is a pointer to pointer of object a, which simulate of "*this" 

    SimulateCopyConstructor(a); // It can compile 
    SimulateCopyConstructor(b); // cannot compile 
    SimulateCopyConstructor(c); // cannot compile 
} 

我觉得发送(*this)复制构造函数类似于上面的情况c。但它不编译。那么它是如何工作的?

+1

'* this'正在引用'this'指针来获取对象,它不会创建指向指针的指针。 'clone'不是一个拷贝构造函数,它是一个常规的成员函数。由于在将基类返回多态对象时发生切片问题,因此它返回指针。 '克隆'也设计得不好,至少应该返回'unique_ptr'。 – nwp

+0

在网上搜索“C++ factory design”和“C++ double delegation”以获取更多示例。 –

+0

@nwp谢谢。 '* this'正在引用'this'指针来获取对象。 这个数字我忽略了什么。 使用上面的例子。 'SimulateCopyConstructor(* b);'模拟情况。 – tom

回答

2
Student b(a); 

不返回Student对象。它声明它并指示编译器在堆栈上分配的新对象上调用一个复制构造器。

new Student(a); 

这确实是返回一个指向一个新的Student对象,因为operator new一样。那里有(a)指示编译器调用new分配的该对象上的副本构造函数。

但是,如果你有一个函数这样做:

Student foo(){ return Student(a); } 

这将创建堆栈一个新Student对象,调用拷贝构造函数,然后从函数返回生成的对象。

+0

谢谢。你让我明白我的第一个问题 只是提醒'新东西;'返回'东西'的指针 就像'new int'返回'int * – tom