Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

Заключение

Возможно, у вас возникнет соблазн поместить все определения методов класса в заголовочный файл внутри тела класса. Хотя это скомпилируется, но здесь есть несколько нюансов:

    Во-первых, как упоминалось выше, это приведет к загромождению определения вашего класса.

    Во-вторых, функции, определенные внутри класса, являются неявно встроенными.

Большие функции, которые вызываются из многих файлов, могут способствовать, таким образом, «раздуванию» вашего кода.

    В-третьих, если вы измените что-либо в заголовочном файле, то вам нужно будет перекомпилировать каждый файл, содержащий этот заголовок.

Это может быть не эффективным, когда одно незначительное изменение заставит перекомпилировать всю программу (что может быть достаточно медленно и долго).

Если же вы изменили код в файле .cpp, то вам необходимо перекомпилировать только этот файл .cpp!

Поэтому рекомендуется следующее:

    Классы, используемые только в одном файле, и которые повторно не используются, определяйте непосредственно в файле .cpp, где они используются.

    Классы, используемые в нескольких файлах или предназначенные для повторного использования, определяйте в заголовочном файле с тем же именем, что у класса.

    Тривиальные методы (обычные конструкторы или деструкторы, функции доступа и т.д.) определяйте внутри тела класса.

    Нетривиальные методы определяйте в файле .cpp с тем же именем, что у класса.

На следующих лекциях большинство классов будут определены в файле .cpp со всеми методами, реализованными непосредственно в теле класса.

Это делается для лаконичности примеров.

В реальных проектах лучше, когда классы помещаются в отдельные файлы .cpp и .h.

Классы и const

Мы знаем, что фундаментальные типы данных (int, double, char и т.д.) можно сделать константными, используя ключевое слово const, и что все константные переменные должны быть инициализированы во время объявления.

В случае с константными фундаментальными типами данных инициализация может быть копирующей, прямой или uniform:

const int value1 = 6; // копирующая инициализация

const int value2(8); // прямая инициализация

const int value3 {11}; // uniform-инициализация (C++11)

Константные объекты классов

Объекты классов можно сделать константными (используя ключевое слово const).

Инициализация выполняется через конструкторы классов:

const Date date1; // инициализация через конструктор по умолчанию

const Date date2(12, 11, 2018); // инициализация через конструктор с

// параметрами

const Date date3 {12, 11, 2018 }; // инициализация через конструктор с

// параметрами в C++11

Как только константный объект класса инициализируется через конструктор, то любая попытка изменить переменные-члены объекта запрещена, так как это нарушает принципы константности объекта.

Запрещается как изменение переменных-членов напрямую (если они являются public), так и вызов методов (сеттеров), с помощью которых можно установить значения переменным-членам.

Рассмотрим следующий класс:

class Anything {

public: