c++ - 仅手动定义部分复制构造函数和赋值运算符

标签 c++ copy-constructor assignment-operator

我想知道是否有一种方法可以实现复制构造函数和赋值运算符,以便在为类重新定义它们时只需要进行少量修改。

例如,考虑这样一个类:

class Foo {
private:
    int* mInt_ptr;
    /* many other member variables
       of different types that aren't
       pointers */
public:
    Foo();
    Foo(const Foo&);
    Foo& operator=(const Foo&);
    ~Foo();
};

现在,为了处理指针 mInt_ptr,我需要在复制构造函数和赋值运算符中适本地处理它。但是,其余的成员变量可以安全地进行浅拷贝。有没有办法自动执行此操作?

一旦一个类变大,显式写出复制非指针成员变量的操作可能会变得乏味和笨拙,所以我想知道是否有一种方法可以编写复制构造函数,例如:

Foo::Foo(const Foo& tocopy)
{
    mInt_ptr = new int(*tocopy.mInt_ptr);
    /* Do shallow copy here somehow? */
}

而不是以下的显式形式:

Foo::Foo(const Foo& tocopy)
{
    mInt_ptr = new int(*tocopy.mInt_ptr);
    mVar1 = tocopy.mVar1;
    mVar2 = tocopy.mVar2;
    ...
    ...
    mVarN = tocopy.mVarN;
}

最佳答案

通常,不要使用原始指针,这正是您现在正在与之抗争的原因。相反,使用合适的智能指针,并使用复制交换赋值:

class Foo
{
     int a;
     Zip z;
     std::string name;
     value_ptr<Bar> p;

public:
     Foo(Foo const &) = default;

     Foo & operator=(Foo rhs)
     {
         rhs.swap(*this);
         return *this;
     }

     void swap(Foo & rhs)
     {
         using std::swap;
         swap(a, rhs.a);
         swap(z, rhs.z);
         swap(name, rhs.name);
         swap(p, rhs.p);
     }
};

namespace std { template <> void swap<Foo>(Foo & a, Foo & b) { a.swap(b); } }

value_ptr 可以是 full-blown implementation ,或者像这样简单的东西:

template <typename T>    // suitable for small children,
class value_ptr          // but not polymorphic base classes.
{
    T * ptr;

public:
    constexpr value_ptr() : ptr(nullptr) { }
    value_ptr(T * p) noexcept : ptr(p) { }
    value_ptr(value_ptr const & rhs) : ptr(::new T(*rhs.ptr)) { }
    ~value_ptr() { delete ptr; }
    value_ptr & operator=(value_ptr rhs) { rhs.swap(*this); return *this; }
    void swap(value_ptr & rhs) { std::swap(ptr, rhs.ptr); }

    T & operator*() { return *ptr; }
    T * operator->() { return ptr; }
};

关于c++ - 仅手动定义部分复制构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12286340/

相关文章:

c++ - Qt:Qt5 Windows 中 BitBlt 的替代品

c++ - ceil 在 vi​​sual c++ 2010 中不包含 <cmath> 的情况下工作

c++ - 如何在派生类中声明复制构造函数,而基类中没有默认构造函数?

r - 如何为数据框行子集的列分配值

c++ - 为什么在这种情况下需要取消引用 'this'? (赋值运算符)

c++ - 从堆栈 C++ 的单链表实现中弹出

c++ - DirectShow 的 eof 检测

C++ 复制构造函数/赋值运算符错误

c++ - 既然你可以在 C++ 中以两种方式声明一个复制构造函数,那哪种方式是正确的?

c++ - 用 const 成员替换一个类型的变量