-2

我有一个关于这个承包商实际上在做什么的问题。我在网上找到了它,它适用于我的目的,但我希望了解它的符号。

class Iterator { 
  int i;
public:
  Iterator(int i = 0) : i(i) {};

  friend class SinglyLinkedList<Element>;
  Node* _current;

  Iterator(SinglyLinkedList& list) {
    this->list = list;
    reset();
  }

  void reset() {
    _current = list._head;
  }

  void next(){
    if(!done()) {
      _current = _current->_next;
    }
  }

  bool done(){
    bool done = false;
    if(_current->_next == nullptr) {
      done = true;
    }
    return done;
  }
private:
  SinglyLinkedList list;
};

这是一个证明它有效的成员函数。

unsigned long print(Element e, const Iterator& index) {
cout << index.i << "\n";
return 0;

const Iterator& index = 2. 函数输出 2。

如果你忽略关于 的部分Element e,基本的想法是我可以使用Iterator(SinglyLinkedList& list)and Iterator(int i = 0),两者都可以。您可以使用 ? 访问整数属性index.i

任何一般的见解也值得赞赏。

4

2 回答 2

4

构造函数

Iterator(int i = 0) : i(i) {}

允许您以三种方式构造迭代器的实例:

  • 您可以在不传递参数的情况下使用此构造函数(在这种情况下假定为零)
  • 您可以显式调用此构造函数,将其传递给单个int参数,或者
  • 您可以隐式调用此构造函数,传递 anint而不是它。

这是第一种方法:

Iterator one;

这里是第二种方式:

Iterator two(123);

这里是第三种方式:

Iterator three = 321;

回到你的代码,当你写这个时

const Iterator& index = 2;

编译器创建一个临时对象,使用构造函数的隐式调用对其进行初始化,并将此临时对象的引用设置为index. 这类似于构造函数的第三种调用(即隐式调用),但目标是隐藏的临时对象。允许编译器在此处使用临时变量,因为index声明了const; 没有它就无法编译。

于 2014-11-03T21:37:09.703 回答
0

dasblinkenlight 的回答 解释了可以使用的不同方式,但我想谈谈这里实际发生的事情。

这条线是Iterator(int i = 0) : i(i) {};让我们分解所有部分。

Iterator(int i=0)做三件事:

  1. 宣布这是Iterator该类的构造函数
  2. 宣布此构造函数采用单个int参数
  3. 为单个参数提供默认值。换句话说,构造函数调用Iterator()并且Iterator(0)会得到相同的结果

: i(i)是一个初始化列表。它将成员变量i(即第一个i)分配给参数的值ii括号中的 The )。

{};是构造函数的主体。这里没有其他任何事情发生,所以它一直是空的。

编写相同内容的更详细的方式如下:

Iterator(){
    i = 0;
}

Iterator(int index){
    i = index;
}

在大多数情况下,该块和您提供的行将具有基本相同的结果,尽管我对 C++ 的复杂性知之甚少,无法知道上述内容是否适用于您拥有的一些有趣的情况(如const Iterator& index = 2

于 2014-11-03T21:42:08.783 回答