减少operator =和拷贝构造函数之间的代码重复

我有一个类需要一个非默认的拷贝构造函数和赋值操作符(它包含指针列表)。 有减少复制构造函数和赋值运算符之间的代码重复的一般方法吗?


在所有情况下编写自定义拷贝构造函数和赋值运算符都没有“通用方法”。 但有一个叫做“复制 - 交换”的成语:

 class myclass
 {
    ...
 public:
    myclass(myclass const&);

    void swap(myclass & with);

    myclass& operator=(myclass copy) {
        this->swap(copy);
        return *this;
    }

    ...
};

它在许多(但不是全部)情况下很有用。 有时你可以做得更好。 向量或字符串可以有更好的分配,如果分配的存储空间足够大,则可以重新分配存储空间。


将通用代码分解为私有成员函数。 一个简单的(相当人为的)例子:

#include <iostream>

class Test
{
public:
  Test(const char* n)
  {
    name = new char[20];
    strcpy(name, n);
  }

  ~Test()
  {
    delete[] name;
  }

  // Copy constructor
  Test(const Test& t)
  {
    std::cout << "In copy constructor.n";
    MakeDeepCopy(t);
  }

  // Assignment operator
  const Test& operator=(const Test& t)
  {
    std::cout << "In assignment operator.n";
    MakeDeepCopy(t);
  }

  const char* get_name() const { return name; }

private:
  // Common function where the actual copying happens.
  void MakeDeepCopy(const Test& t)
  {        
    strcpy(name, t.name);
  }

private:
  char* name;
};

int
main()
{
  Test t("vijay");
  Test t2(t); // Calls copy constructor.
  Test t3(""); 
  t3 = t2; // Calls the assignment operator.

  std::cout << t.get_name() << ", " << t2.get_name() << ", " << t3.get_name() << 'n';

  return 0;
}

My &My::operator = (My temp)  // thanks, sellibitze
{
    swap (*this, temp);
    return *this;
}

并实现一个专门的std::swap<> (My &, My &)

链接地址: http://www.djcxy.com/p/72905.html

上一篇: Reducing code duplication between operator= and the copy constructor

下一篇: C++ code in header files