У меня есть вопрос о том, что на самом деле делает этот подрядчик. Я нашел его в Интернете, и он работает для моих целей, но я хочу понять его обозначения.
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
?
Любое общее понимание также приветствуется.
Конструктор
Iterator(int i = 0) : i(i) {}
позволяет создать экземпляр итератора тремя способами:
int
аргумент илиint
вместо этого.Вот первый способ:
Iterator one;
Вот второй способ:
Iterator two(123);
Вот третий способ:
Iterator three = 321;
Вернуться к вашему коду, когда вы пишете это
const Iterator& index = 2;
компилятор создает временный объект, инициализирует его, используя неявный вызов вашего конструктора, и устанавливает ссылку на этот временный объект в index
, Это похоже на третий тип вызова конструктора (то есть неявный), но целью является скрытый временный объект. Компилятору разрешено использовать временный здесь, потому что index
объявлен const
; это не скомпилировалось бы без этого.
dasblinkenlight’s answer
объясняет, как это можно использовать, но я хочу поговорить о том, что на самом деле здесь происходит.
Линия Iterator(int i = 0) : i(i) {};
Давайте разберем все части.
Iterator(int i=0)
делает три вещи:
Iterator
учебный классint
аргументIterator()
а также Iterator(0)
будет иметь тот же результат: i(i)
список инициализатора Назначает переменную-член i
(Это первое i
) к значению параметра i
(The i
в скобках).
{};
это тело конструктора. Здесь больше ничего не происходит, поэтому он остался пустым.
Более подробный способ написать то же самое будет следующим:
Iterator(){
i = 0;
}
Iterator(int index){
i = index;
}
Этот блок и предоставленная вами строка в большинстве случаев будут иметь практически одинаковый результат, хотя я не достаточно разбираюсь в тонкостях C ++, чтобы знать, сработает ли вышеперечисленное для некоторых интересных случаев (например, const Iterator& index = 2
)