我正在编写一个嵌套迭代器的双向链表。当我在编写复制构造函数和运算符=重载时,我遇到了拷贝-交换惯用法。但是从我的理解来看,它使用了三原则(如果您愿意,还有半个)。但是迭代器没有析构函数,因为它们指向的“节点”并不是它们的“属性”,而是双向列表的。这是一个大学作业,无论如何都要写一个复制构造函数和运算符,无论是否与隐含定义相同。我的问题是,拷贝-交换惯用法是否总是需要一个析构函数?如果是迭代器情况下,这样做是否可行,还是我应该使用普通的“脏”赋值?以下是我的迭代器类的相关部分:
上面部分展示了迭代器的构造函数和私有数据。下面部分展示了它的赋值和交换函数。
这是我的实现,我想知道在这里使用明智吗?(我的迭代器没有析构函数,因此我提出了这个问题)。
template<class T>
class List<T>::ForwardIterator {
private:
Node<T> *current;
public:
ForwardIterator(Node<T> *curr = nullptr) : current(curr) {}
ForwardIterator(const ForwardIterator& right) : current(right.current) {}
...
...
上面部分展示了迭代器的构造函数和私有数据。下面部分展示了它的赋值和交换函数。
friend void swap(ForwardIterator& first, ForwardIterator& second) {
using std::swap;
swap(first.current, second.current);
}
ForwardIterator& operator=(ForwardIterator right) {
swap(*this, right);
return *this;
}
这是我的实现,我想知道在这里使用明智吗?(我的迭代器没有析构函数,因此我提出了这个问题)。
ForwardIterator(const ForwardIterator& right)
,它将由编译器隐式声明。这意味着在您的情况下,您无需关心三五法则(实际上是五)。 - UmNyobeYouClass(YourClass const&) = default;
不算是自己写的吧? - WhozCraig