C ++ Объясните «один вкладыш» конструктор, который перегружает функцию-член Iterator (int i = 0): i (i) {};

У меня есть вопрос о том, что на самом деле делает этот подрядчик. Я нашел его в Интернете, и он работает для моих целей, но я хочу понять его обозначения.

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?

Любое общее понимание также приветствуется.

-2

Решение

Конструктор

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

позволяет создать экземпляр итератора тремя способами:

  • Вы можете использовать этот конструктор без передачи аргументов (в этом случае предполагается, что ноль)
  • Вы можете вызвать этот конструктор явно, передав ему один int аргумент или
  • Вы можете вызывать этот конструктор неявно, передавая int вместо этого.

Вот первый способ:

Iterator one;

Вот второй способ:

Iterator two(123);

Вот третий способ:

Iterator three = 321;

Вернуться к вашему коду, когда вы пишете это

const Iterator& index = 2;

компилятор создает временный объект, инициализирует его, используя неявный вызов вашего конструктора, и устанавливает ссылку на этот временный объект в index, Это похоже на третий тип вызова конструктора (то есть неявный), но целью является скрытый временный объект. Компилятору разрешено использовать временный здесь, потому что index объявлен const; это не скомпилировалось бы без этого.

4

Другие решения

dasblinkenlight’s answer
объясняет, как это можно использовать, но я хочу поговорить о том, что на самом деле здесь происходит.

Линия Iterator(int i = 0) : i(i) {}; Давайте разберем все части.

Iterator(int i=0) делает три вещи:

  1. Объявляет, что это конструктор для Iterator учебный класс
  2. Объявляет, что этот конструктор занимает один int аргумент
  3. Предоставляет значение по умолчанию для одного аргумента. Другими словами, конструктор вызывает Iterator() а также Iterator(0) будет иметь тот же результат

: i(i) список инициализатора Назначает переменную-член i (Это первое i) к значению параметра i (The i в скобках).

{}; это тело конструктора. Здесь больше ничего не происходит, поэтому он остался пустым.

Более подробный способ написать то же самое будет следующим:

Iterator(){
i = 0;
}

Iterator(int index){
i = index;
}

Этот блок и предоставленная вами строка в большинстве случаев будут иметь практически одинаковый результат, хотя я не достаточно разбираюсь в тонкостях C ++, чтобы знать, сработает ли вышеперечисленное для некоторых интересных случаев (например, const Iterator& index = 2)

0