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)
делает три вещи:
- Объявляет, что это конструктор для
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
)