Язык программирования C++. Программа на первый семестр
Курс расчитан на студентов, владеющих синтаксисом хотя бы одного из
"стандартных" структурных языков программирования (C, Pascal, Fortran, и
т.п.). Это значит, что в нем не будет рассказываться об основных понятиях:
переменных, функциях, условных операторах, циклах и.т.д. В этом плане, кроме
того, предполагается, что слушатели знакомы с основным синтаксисом языка C.
Краткое содержание лекций
- Языки C и C++
С++ — (почти) надмножество C. Возможность написания эффективных
программ на C++. Сложности программирования на C++: прямая работа с памятью.
Размер языка C++, невозможность изложения всего в одном курсе.
Превращение кода в программу: компиляция и линковка. Что проверяется
при компиляции, а что — при сборке. Структура программы на C/C++: файлы кода и
заголовочные файлы. Что можно поместить в заголовочные файл, а что — нельзя.
Макросы — очень плохая идея. Макросы для защиты от повторного включения
заголовочного файла. Зависимости между частями программы. Makefile.
Практика: Написание простой программы, состоящей из нескольких файлов кода и
заголовочного файла. Написание Makefile. Target 'clean'.
- Как работает программа.
Во что превращается этот код в исполняемом файле. Структура исполняемой
программы. Раздел кода, раздел данных. Использование памяти в работающей
программе. Стек и куча. Как передаются параметры функции. Где оказываются
локальные переменные.
Практика: Управляющие структуры языка C. Процесс компиляции. Если окажется,
что все достаточно просто — преобразование .c в .S.
- Указатели и ссылки.
Передача параметра с помощью указателя. Взятие адреса переменной и,
наоборот, значения по адресу. Неинициализированные указатели. Нулевой
указатель. Потенциальные проблемы при использовании указателей. Ссылки.
Сходство с ссылок с указателями и их отличия. Как хранятся ссылки.
Практика: Передача параметров с помощью указателей и ссылок. Получить
seg.faults
- Распределение памяти в куче.
Язык C:
malloc
/free
. Язык C++:
new
/delete
и new[]
/delete[]
.
Почему нужны 2 набора операторов. Потенциальные проблемы. Вопросы
производительности. Двумерные массивы.
Практика: Заработать переполнение памяти. Выделить место под двумерный
массив разными способами. Сравнить время работы разных способов выделения
памяти.
- С++ как "С с удобными структурами".
Идея инкапсуляции. Конструктор и деструктор. Класс "самоуправляющегося"
массива. Автоматический вызов деструктора. Об опасности неожиданного
завершения программы. Еще о различиях
malloc
/free
и
new
/delete
. Конструктор копирования. Проблемы с
присваиванием объектов. Как запретить присваивание.
Практика: Класс массива, класс двумерного массива.
- Строки в C. Ввод и вывод в C и C++.
Массивы и указатели. Строки. Конеч строки. Строковые константы. Операции
со строками.
Дескриптор файла,
FILE
. Что происходит пр открытии закрытии файла.
Буфферизация, flush
/fflush
. Стандартные файлы
stdin
, stdout
, stderr
.
Практика: Потоковый вывод на экран (std::out
,
std::err
, без объяснения смысла).
Практика: Написать на основе FILE
свой поток (без операторов).
- "Внутренности" класса.
Поля и методы. Ограничение прав доступа к членам класса. Все поля должны быть
private
. Почему это удобно. Проблемы с производительностью.
inline
. Какие методы стоит делать public
? Принцип
"всегда целого" объекта. Что нужно оптимизировать программисту, а что сделает
за него компилятор. Примеры оптимизации: никогда не вызывать функцию дважды.
Code conventions.
Практика: Рациональные числа, приведение к общему знаменателю.
- Инициализация и
const
.
Потенциальные проблема: неинициализированные переменные. Возможности
инициализации в конструкторе. Другая проблема — случайное изменение
переменных. Решение: константные поля. Констатные методы. Константное
возвращаемое значение. "Заразность" const
. Идея возвращения
значения по ссылке. возможность создания "парных" методов
const
/не-const
. this
.
Практика: Класс массива, класс-обертка для FILE
.
- Слово
static
.
Статические "глобальные" переменные. Статические локальные переменные.
Статические функции. Статические члены класса. Необходимость инстанциации
статических полей. Code conventions.
Практика: Глобальные константы. Адреса глобальных и статических переменных.
Подсчет числа вызовов, количества экземпляров класса.
- Некоторые возможности C++, о которых стоит упомянуть.
namespace
. mutual
. перегрузка операторов.
перегрузка оператора присваивания. не стоит злоупотреблять перегрузкой (кроме
оператора присваивания).
Практика: Рациональные числа с операторами.
- Наследование.
Идея "расширения" типа. Проблемы с копированием. Неявное приведение типов.
protected
. Подробнее об ограничениях, которые накладывают права
доступа. friend
'ы. Сравнение с другими языками (Java).
Невозможность полной защиты в C++. Права доступа как средство
"самоограничения" для программиста.
Практика: Добавить к потоку вывода удобные доп. возможности для вывода чего-нибудь
специального (например, рациональных чисел).
- Перегрузка и переопределение. Полиморфизм.
Перегрузка имен методов. Не стоит злоупотреблять перегрузкой. Перегрузка
конструкторов. Сложные правила выбора из перегруженных методов. Статическая и
динамическая типизация: разные подходы в разных языках.
Перегрузка и переопределение — разные слова. Виртуальные методы.
Чисто виртуальные методы. Таблица виртуальных функций. Снова о статической и
динамической типизации. Виртуальные деструкторы. Порядок построения таблицы.
Опасность вызова виртуальных методов из конструктора. Почему это не запрещено
синтаксически?
Практика: Добавить к потоку вывода удобные доп. возможности.
Вызов виртуального метода из конструктора.
Последние 2 лекции носят скорее "обзорный" характер, подробнее эти темы
будут обсуждаться во втором семестре. Более того, этими 2 лекциями можно
пожертвовать в случае нехватки времени.
- Забавы с указателями.
Написание класса
scoped_ptr
(без template'ов). Задача: то же самое для массива.
Возможные расширения идеи: auto_ptr
. Возможные расширения идеи: считающие ссылки.
-
Идея template'ов.
scoped_ptr
на template'ах. Общая идея template'ов. Понятие об STL.