Программирование. Принципы и практика использования C++ Исправленное издание, стр. 128
Для полноты картины укажем еще один способ инициализации с помощью синтаксической конструкции, напоминающей аргументы функции в скобках.
int x(2); // инициализируем двойкойDate sunday(2009,8,29); // инициализируем объект Sunday // триадой (2009,8,29)Функцию-член класса можно также определить в определении класса.
// простой класс Date (детали реализации будут рассмотрены позднее)class Date {public: Date(int yy, int mm, int dd) :y(yy), m(mm), d(dd) { // ... }void add_day(int n){ // ...}int month() { return m; } // ...private: int y, m, d; // год, месяц, день};Во-первых, отметим, что теперь объявление класса стало больше и запутаннее. В данном примере код конструктора и функции
add_day()month()Date::month()Обратите внимание на то, что функция
month()month()
• Функция становится подставляемой (inlined), т.е. компилятор попытается сгенерировать код подставляемой функции вместо ее вызова. Это может дать значительное преимущество часто вызываемым функциям, таким как
month()• При изменении тела подставляемой функции-члена класса придется скомпилировать заново все модули, в которых он используется. Если тело функции определено за пределами объявления класса, то потребуется перекомпилировать только само определение класса. Отсутствие необходимости повторного компилирования при изменении тела функции может оказаться огромным преимуществом в больших программах.
9.4.5. Ссылка на текущий объект
Рассмотрим простой пример использования класса
Dateclass Date { // ... int month() { return m; } // ...private: int y, m, d; // год, месяц, день};void f(Date d1, Date d2){ cout << d1.month() << ' ' << d2.month() << '\n';}Откуда функции
Date::month()d1.md2.mDate::month()Date::month()Date::month()d1.md2.m9.4.6. Сообщения об ошибках
DateDateDateDate// простой класс Date (предотвращаем неверные даты)class Date {public: class Invalid { }; // используется как исключение Date(int y, int m, int d); // проверка и инициализация даты // ...private: int y, m, d; // год, месяц, день bool check(); // если дата правильная, возвращает true};Мы поместили проверку корректности даты в отдельную функцию
check()