正确编码:返回类的新实例时

时间:2012-10-18 05:44:52

标签: c++ optimization

假设我有一个名为MyClass的类,它有两个成员变量(均为int),称为firstNumber_secondNumber_。这个类还有一个名为clone( )的方法,它创建一个具有相同值的对象的新实例,并返回该新实例。

问题是,当返回类的新实例时,我是将它作为指针,引用还是实例本身返回?

// MyClass.h
class MyClass {
private:
    int firstNumber_;
    int secondNumber_;

public:
    MyClass( int numA, int numB ) {
         firstNumber_ = numA;
         secondNumber_ = numB;
    }

    ~MyClass( ) { };

    // This method creates a copy of the object and returns that object.
    // The ( ? ) is there because I am not sure what type the returned value is.
    MyClass ( ? ) clone( ) {
         // Do I just return the new instance? Or do I need to return a reference or a pointer of the new instance?
         return MyClass( firstNumber_, secondNumber_ );
    }
};

实现这一目标的正确方法是什么?请注意,MyClass不会从任何其他类继承。

提前致谢。

1 个答案:

答案 0 :(得分:3)

方法clone()通常用于返回指向多态类型实例的指针,因此您可以在基类型的指针上调用它,并获取指向右派生类型实例的指针。对于简单复制,在C ++中使用复制构造函数,而不是克隆方法。

克隆方法:

struct Base{};
struct Foo : Base 
{
  Base* clone() const { return new Foo(*this); }
}:

Base * b1 = new Foo;
...
Base * b2 = b1->clone(); // points to a Foo instance, copy of object pointed at by b1

clone方法使用(编译器生成的)复制构造函数。

使用复制构造函数:

Foo f1;
Foo f2 = f1; // copy assignment

在实际代码中,您应该更喜欢这些示例中使用的原始智能指针。

关于返回值,默认情况下应该按值返回,但在多态clone()示例中,这会通过将返回对象切换为Base来破坏目的。所以我们返回一个指向动态分配的实例的指针。意图和所有权必须明确:在这种情况下,调用者拥有指针,并负责解除分配。 Pre-c ++ 11你必须依靠文档来传达这一点。在C ++ 11中,您可以使用智能指针std::unique_ptr,它强制执行所有权并清楚地说明它。