首页 > 解决方案 > C++:迭代器的复制构造函数

问题描述

我目前正在更新我的语言知识,并在此处找到以下示例定义迭代器类。我说这个迭代器中的复制构造函数的方式是这样定义的,它只会创建一个浅拷贝,或者我错过了什么?

考虑到类属性是一个 int 指针,这不会在使用时产生问题吗?

谢谢。

// std::iterator example
#include <iostream>     // std::cout
#include <iterator>     // std::iterator, std::input_iterator_tag

class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
  int* p;
public:
  MyIterator(int* x) :p(x) {}
  MyIterator(const MyIterator& mit) : p(mit.p) {}
  MyIterator& operator++() {++p;return *this;}
  MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
  bool operator==(const MyIterator& rhs) const {return p==rhs.p;}
  bool operator!=(const MyIterator& rhs) const {return p!=rhs.p;}
  int& operator*() {return *p;}
};

标签: c++

解决方案


“深度”复制的概念仅适用于通过某种引用(例如指针)拥有另一个对象的对象。迭代器以非拥有方式使用其值(指针),因此复制该指针的值足以维护类的语义。

事实上(正如 Caleth 在评论中指出的那样),在这种情况下,默认情况下编译器会精确地生成这个 copy-ctor,所以你甚至不必编写它。

如果您的 copy-ctor 实际上复制了指向的数据,那么它就不是一个很好的迭代器,因为您将失去对要迭代的对象的访问权限。


推荐阅读