Программирование. Принципы и практика использования C++ Исправленное издание, стр. 126
void f(){ Date today; // ... cout << today << '\n'; // использовать объект today // ... init_day(today,2008,3,30); // ... Date tomorrow; tomorrow.y = today.y; tomorrow.m = today.m; tomorrow.d = today.d+1; // добавляем единицу к объекту today cout << tomorrow << '\n'; // используем объект tomorrow}Здесь мы “забыли” немедленно инициализировать объект
todayinit_day()add_day()tomorrowDatedtodayТакие размышления приводят нас к мысли о необходимости функции инициализации, которую нельзя забыть, и об операциях, которые невозможно пропустить. Основным инструментом в этом механизме являются функции-члены, т.е. функции, объявленные как члены класса внутри его тела. Рассмотрим пример.
// простая структура Date,// гарантирующая инициализацию с помощью конструктора// и обеспечивающая удобство обозначенийstruct Date { int y, m, d; // год, месяц, день Date(int y, int m, int d); // проверяем корректность даты // и выполняем инициализацию void add_day(int n); // увеличиваем объект типа Date на n дней};Функция-член, имя которой совпадает с именем класса, является особой. Она называется конструктором (constructor) и используется для инициализации (конструирования) объектов класса. Если программист забудет проинициализировать объект класса, имеющего конструктор с аргументом, то компилятор выдаст сообщение об ошибке. Для такой инициализации существует специальная синтаксическая конструкция.
Date my_birthday; // ошибка: объект my_birthday не инициализированDate today(12,24,2007); // Ой! Ошибка на этапе выполненияDate last(2000, 12, 31); // OK (разговорный стиль)Date christmas = Date(1976,12,24); // также OK (многословный стиль)Попытка объявить объект
my_birthdaytoday12,24,2007Определение объекта
lastDateDate(1976,12,24)=Теперь можно попробовать использовать вновь определенные переменные.
last.add_day(1);add_day(2); // ошибка: какой объект типа Date?Обратите внимание на то, что функция-член
add_day()Date9.4.3. Скрываем детали
Остается одна проблема: что произойдет, если мы забудем использовать функцию-член
add_day()Date birthday(1960,12,31); // 31 декабря 1960 года++birthday.d; // Ой! Неправильная датаDate today(1970,2,3);today.m = 14; // Ой! Неправильная дата // today.m == 14
DateDateТакие размышления приводят к выводу, что представление типа
Date// простой типа Date (управление доступом)