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; это не скомпилировалось бы без этого.

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

Линия 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)

Другие вопросы по тегам