Собственна отчет, требуемый в работе:
Задание №1:
При создании экземпляра класса сначала вызывается конструктор данного класса, а перед выходом из программы - его деструктор. Количество вызовов конструктора и деструктора, равно количеству экземпляров, создаваемых в программе.
Задание №2:
Передачу параметра id осуществим по константной ссылке. Данный способ выбран из соображений, что: нам необходимо лишь присвоить переменной m_id значение переменной id, следовательно создавать копию переменной id ни к чему. Ссылка константная, т.к значение переменной id никак не должно быть изменено.
Также в данной программе увидели, что если имеется создание нескольких экземпляров данного класса, то их конструкторы вызываются последовательно, а деструкторы - в обратном порядке, т.е экземпляр созданный последним уничтожается самым первым.
Задание №3:
При передаче экземпляра в качестве параметра функции по значению происходит неявный вызов конструктора копирования, и создается точная копия нашего экземпляра. После выхода из функции вызывается деструктор класса, который уничтожает копию экземпляра, а сам экземпляр будет уничтожен при выходе из программы.
При передача экземпляра по ссылке копия не создается поэтому нет дополнительных вызовов конструктора и деструктора.
Объявив явным образом конструктор копирования, при передаче экземпляра как параметра по значению, снова происходит неявный вызов но уже объявленного нами конструктора а не созданного компилятором.
Задание №4:
Для установки нового режима работы робота, используем метод SetMode, значение в который передаем по константной ссылке, т.к нет необходимости затрачивать память на копию переменной и ссылка является константной, т.к внутри метода переменная никак не должна быть изменена, квалификатор const на метод не навешиваем, т.к в процессе его работы изменяются поля класса.
Для получения текущего режима работы робота используем метод GetMode, никаких параметров он не имеет, но на данный метод навешиваем квалификатор const, т.к в ходе его работы поля класса не изменяются.
Выбор квалификатора const в функции TestPassingObjectByReference остался прежним, т.к после добавления в тело функции метода GetMode, функция не стала изменять поля класса, следовательно ссылка также остается константной.
Также не изменился выбор квалификатора const в методе SetMode, т.к данный метод принимает значение по ссылке и не должен его никак изменять.
Задание №5:
Создаем методы SetMode и FinishCurrentTask. В методе FinishCurrentTask квалификатор const вообще не используется т.к этот метод не принимает параметров, но при этом изменяет поля класса. В методе SetMode квалификатор const используется для передачи параметра по константной ссылке, т.к данный параметр не должен изменяться в ходе работы метода а используется лишь его значение.
Задание №6:
При создании объекта в динамической памяти, с помощью оператора new, вызывается конструктор класса, но при завершении работы программы деструктор не был вызван. При добавлении оператора delete данная проблема была решена и появился вызов деструктора в момент вызова оператора delete.
Если мы создаем массив, содержащий N объектов, то конструктор будет вызван N раз. При добавлении оператора delete[] происходит вызов деструктора класса также N раз.
Задание №7:
- Метод FileClose() не принимает параметров, квалификатор const не используется т.к данный метод изменяет значение полей класса - адрес указателя на файл
- Метод FileOpen(std::string const & name, std::string const & mode) принимает два параметра по константной ссылке, т.к в методе используются лишь их значения а сами параметры никак не изменяются, метод не является константным т.к изменяет поля класса - адрес указателя на файл
- Метод IsOpened()const не принимает параметров, является константным, т.к не изменяет поля класса, а только возвращает значение
- Метод IsEndOfFile()const аналогичен методу IsOpened()const
- Метод GetChar() не принимает параметров и не является константным, т.к изменяет внутреннее состояние объекта - позицию курсора
- Метод PutChar(char const & ch) принимает параметр по константной ссылке, т.к используется лишь его значение. Метод не константный т.к изменяет внутреннее состояние объекта - позицию курсора
- Метод GetLength()const является константным, т.к не изменяет полей класса
- Метод Seek(long const & position, int const & refrence) принимает два параметра по константной ссылке, используем только их значения сами параметры не меняем, не является константным, т.к меняет внутреннее состояние объекта - позицию курсора
- Метод GetPosition()const возвращает текущую позицию, т.е не меняет полей класса и является константным
- Метод Write(const void *pBuffer, size_t const & size, size_t const & count) у всех принимаемых параметров используется только значения, поэтому они передаются по константным ссылкам, изменяет внутреннее состояние объекта - позицию курсора
- Метод Read(void *pBuffer, size_t const & size, size_t const & count) аналогичен методу Write с той лишь разницей, что первый параметр передается просто по значению, т.к его значение изменяется внутри данного метода