C++ 在迭代器上使用复制构造函数

C++ 在迭代器上使用复制构造函数,c++,iterator,C++,Iterator,我在试着做迭代器。作为一名建造师,我有: iterator(Node* node) { it = node; } 和复制构造函数: iterator(const iterator& x) { it = x.it; } 有人告诉我,使用第一个不是一个好主意,而使用第二个(哪个更好) 我不知道如何在这样的方法中使用第二种方法: typedef iterator<Key, Info> ringIterator; ringIterator begin() {

我在试着做迭代器。作为一名建造师,我有:

iterator(Node* node)
{
    it = node;
}
和复制构造函数:

iterator(const iterator& x)
{
    it = x.it;
}
有人告诉我,使用第一个不是一个好主意,而使用第二个(哪个更好)

我不知道如何在这样的方法中使用第二种方法:

typedef iterator<Key, Info> ringIterator;

ringIterator begin()
{
    return ringIterator(any);
}
typedef迭代器环迭代器;
环迭代器begin()
{
返回环迭代器(任意);
}
A是一个构造函数,它接受对同一类型的引用(通常但不一定是常量)

因此,
迭代器(节点*)
不是复制构造函数。它是集合中某个内部实体的构造函数

在集合的
begin()
(和
end()
以及其他返回迭代器的方法)的实现中确实需要该构造函数。然而:

  • 它应该标记为显式,这样它就不会用于隐式转换
  • 最好不要在两个类之外可见。可能是通过将其私有化并使用合适的
    friend
    声明。您可能应该将迭代器和内部
    节点
    类型嵌套在集合中;这样,
    节点本身就可以是私有的(但您没有显示您正在编写的集合的完整结构,因此我不能确定如何将其组合在一起)

  • 第一个不是复制构造函数,这是一个构造函数,不可能避免这个。通常,我们将此构造函数声明为私有,并将类节点声明为迭代器的朋友,以便它可以将迭代器初始化为内部开始节点的值。例如,在“如何实现”中,我正在执行双链接环,其中节点为私有结构。我的迭代器是Ring类的公共部分您可能对声明感兴趣的部分:请注意,复制构造函数不必接受常量引用。@juanchopanza但有许多地方认为复制构造函数永远不会修改参数reasons@Caleth当然,但那是另一回事。