复制运算符为的构造函数

copy constructor with operator=

本文关键字:构造函数 运算符 复制      更新时间:2023-10-16

我在这里得到了这个代码:

class DerivedClass : public BaseClass {
    SomeClass* a1;
    Someclass* a2;
public:
    //constructors go here
    ~DerivedClass() { delete a1; delete a2;}
    // other functions go here ....
};

我的第一个问题如下:

  • 我可以给"DerivedClass"写一个"operator="吗?(如果你的答案是肯定的,你能告诉我怎么做吗?)

我的第二个问题是:

  • 如果上面的答案是肯定的,你能告诉我如何使用你事先写的"operator="制作一个"复制构造函数"吗(如果可能的话)

以下是编写复制构造函数和赋值运算符的最佳方法,遵循"零规则":

#include <optional>
class DerivedClass : public BaseClass
{
    std::optional<SomeClass> a1;
    std::optional<SomeClass> a2;
public:
    //constructors go here
};

编译器将为析构函数、复制构造函数和复制赋值运算符编写正确的代码。如果SomeClass是可移动的,您将免费获得移动赋值和移动构造函数。

如果SomeClass是多态的,您将需要一个clone()函数,就像前面提到的BogoIt一样。但即使在这种情况下,使用智能指针也是有价值的(std::unique_ptr是合适的)。

复制ctor和op=的主体取决于您计划存储资源的方式:a1和a2变量。如果您需要将它们复制到另一个类,那么您应该编写一些函数来完整复制SomeClass对象。另一种情况是,您可以简单地复制指针值,但要非常小心使用它们的方式,尤其是删除它们。共享资源问题最简单的解决方案是使用一些智能指针,例如boost::shared_ptr或c++11 std::shared-ptr。

因此,如果你计划复制你的资源:

class DerivedClass : public BaseClass {
    SomeClass* a1;
    Someclass* a2;
public:
    // note: do not forget to assign zeroes to your pointers, unless  you use some kind of smart pointers
    DerivedClass()
    :a1(0), a2(0){}
    DerivedClass(const DerivedClass& d)
                :a1(0), a2(0)
    {
        *this = d;
    }
    DerivedClass& operator=(const DerivedClass& d)
    {
        if (this == &d)
            return *this;
        delete a1;
        a1 = d.a1->clone();
        delete a2;
        a2 = d.a2->clone();
        return *this;
    }

    //constructors go here
    ~DerivedClass() { delete a1; delete a2;}
    // other functions go here ....
};

您还需要SomeClass的clone()函数,它将复制您的对象:class SomeClass{公用:

    SomeClass* clone() const
    {
        return new SomeClass();
    }
};