调用Copy构造函数和Normal Constructor的成本

时间:2013-04-16 10:25:25

标签: c++ design-patterns

在原型设计模式中,抽象基类的克隆方法实现如下

/* From Wikipedia */
class Prototype
{
public:
    virtual ~Prototype() { }

    virtual Prototype* clone() const = 0;
};

class ConcretePrototype : public Prototype
{
  ...
  virtual ConcretePrototype* clone() const 
  { 
      return new ConcretePrototype(*this); 
  } 
};

客户端创建一个对象,然后调用clone()方法来创建对象的副本

新的ConcretePrototype(* this)比新的ConcretePrototype()便宜吗?

3 个答案:

答案 0 :(得分:1)

你误解了clone()的目的。

这是一个“虚拟副本构造函数”。

构造函数实际上不能是虚拟的(甚至不是复制构造函数)。因此,解决方案是使用一种方法,您可以调用已经拥有的对象进行精确复制。

克隆的副本有自己的生命周期,因此可以安全地销毁原始文件。

通常,您会希望实现类具有私有或受保护的复制构造函数,因此您无法直接调用它。

您甚至不必知道要克隆的对象的类型。并注意“共变”返回类型。

我不知道你的意思是“更便宜”。如果你为你的类实现了一个拷贝构造函数,它通常应该至少同样有效,并且通常比创建类的空实例然后复制到它中更有效。

答案 1 :(得分:0)

您应该在此模式中使用copy c-tor,因为它是模式的意义。 但在其他情况下 - 所有这些都取决于default构造函数和copy-constructor中的操作。

答案 2 :(得分:0)

如果我理解你的问题,请给出代码:

ConcretePrototype original;
{some code}
ConcretePrototype copy1;
copy1 = *orignal.clone();
ConcretePrototype copy2(original);

copy1的创建成本高于copy2。我能看到您的唯一方法是将default c-torcopy c-tor进行比较,并在一个代码示例中使用克隆。

最有可能是的。多少?很难说。 默认构造函数可能以创建浅表副本的方式实现,因此开销很小。