我对这个承包商的实际行动有疑问。我在网上找到它并且它适用于我的目的,但我希望理解它的符号。
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)
和Iterator(int i = 0)
。您可以使用index.i
?
任何一般的见解也值得赞赏。
答案 0 :(得分:4)
构造函数
Iterator(int i = 0) : i(i) {}
允许您以三种方式构造迭代器的实例:
int
参数或int
而不是它。这是第一种方式:
Iterator one;
以下是第二种方式:
Iterator two(123);
以下是第三种方式:
Iterator three = 321;
回到你的代码,当你写这个
const Iterator& index = 2;
编译器创建一个临时对象,使用构造函数的隐式调用对其进行初始化,并将此临时对象的引用设置为index
。这类似于构造函数的第三种调用(即隐式的),但目标是隐藏的临时对象。允许编译器在此使用临时,因为index
被声明为const
;没有它就不会编译。
答案 1 :(得分:0)
dasblinkenlight's answer 解释了可以使用的不同方法,但我想谈谈这里实际发生了什么。
该行是Iterator(int i = 0) : i(i) {};
让我们分解所有部分。
Iterator(int i=0)
做了三件事:
Iterator
类int
参数Iterator()
和Iterator(0)
将具有相同的结果 : i(i)
是初始化列表。它将成员变量i
(这是第一个i
)分配给参数i
的值(括号中的i
)。
{};
是构造函数的主体。这里没有其他任何事情发生,所以它一直空着。
编写相同内容的更详细的方法如下:
Iterator(){
i = 0;
}
Iterator(int index){
i = index;
}
在大多数情况下,那个块和你提供的行基本上会有相同的结果,虽然我不太了解错综复杂的C ++,知道上面的内容是否适用于你所拥有的一些有趣的案例(如const Iterator& index = 2
)