More C++ Classes: Copy and Move Semantics: Listing 1

Overriding copy semantics to implement deep tree copies.

// copy constructor.
tree::tree(const tree<T>& other) : tree{}
{
  // if the other tree isn't empty, it's copied from its root.
  if (!other.is_empty()) root_.reset(new node{*(other.root_)});
}

// copy assignment.
tree::tree& operator=(const tree<T>& other)
{
  if (this == &other) return *this; // handle self-assignment

  // if the left-side tree isn't empty, it's cleared. Existing nodes are deleted.
  if (!is_empty())
  {
    root_.reset(nullptr);
  }

  // if the other tree isn't empty, it's copied from its root.
  if (!other.is_empty()) root_.reset(new node{*(other.root_)});

  return *this;
}

About the Author

Diego Dagum is a software architect and developer with more than 20 years of experience. He can be reached at email@diegodagum.com.