Скрытое имя (hidden name). Имя, объявленное в области видимости, но скрытое ранее объявленной сущностью с тем же именем, объявленным вне этой области видимости.
Тело функции (function body). Блок операторов, в котором определены действия функции.
Тип возвращаемого значения (return type). Часть объявления функции, определяющее тип значения, которое возвращает функция.
Функцияconstexpr
. Функция, способная возвратить константное выражение. Функция constexpr
неявно является встраиваемой.
Функция (function). Именованный блок действий.
Функция-кандидат (candidate function). Одна из функций набора, рассматриваемая при поиске соответствия вызову функции. Кандидатами считаются все функции, объявленные в области видимости обращения, имя которых совпадает с используемым в обращении.
Глава 7
Классы
Классы в языке С++ используются для определения собственных типов данных. Определение типов, отражающих концепции решаемых задач, позволяет существенно упростить написание, отладку и модификацию программ.
В этой главе будет продолжено описание классов, начатое в главе 2. Основное внимание здесь уделяется важности абстракции данных, позволяющей отделять реализацию объекта от операций, в которых объект может участвовать. В главе 13 будет описано, как контролировать происходящее при копировании, перемещении, присвоении и удалении объекта, а в главе 14 рассматривается определение собственных операторов.
Инкапсуляция обеспечивает разделение интерфейса и реализации класса. Инкапсулируемый класс скрывает свою реализацию от пользователей, которые могут использовать интерфейс, но не имеют доступа к реализации класса.
Класс, использующий абстракцию данных и инкапсуляцию, называют
7.1. Определение абстрактных типов данных
Класс Sales_item
, использованный в главе 1, является абстрактным типом данных. При использовании объекта класса Sales_item
задействовался его интерфейс (т.е. операции, описанные в разделе 1.5.1). Мы не имели доступа к переменным-членам, хранящимся в объекте класса Sales_item
. На самом деле нам даже не было известно, какие переменные-члены имеет этот класс.
Наш класс Sales_data
(см. раздел 2.6.1) не был абстрактным типом данных. Он позволяет пользователям обращаться к его переменным-членам и вынуждает пользователей писать собственные операции. Чтобы сделать класс Sales_data
абстрактным типом, необходимо определить операции, доступные для его пользователей. Как только класс Sales_data
определит собственные операции, мы сможем инкапсулировать (т.е. скрыть) его переменные-члены.
7.1.1. Разработка класса Sales_data
В конечном счете хочется, чтобы класс Sales_data
поддержал тот же набор операций, что и класс Sales_item
. У класса Sales_item
была одна isbn
, а также поддерживались операторы +
, =
, +=
, <<
и >>
.
Определение собственных операторов рассматривается в главе 14, а пока определим обычные (именованные) функции для этих операций. По причинам, рассматриваемым в разделе 7.1.5, функции, осуществляющие сложение и операции ввода-вывода, не будут членами класса Sales_data
. Мы определим эти функции как обычные. Функция, выполняющая составное присвоение, будет членом класса, и по причинам, рассматриваемым в разделе 7.1.5, наш класс не должен определять присвоение.
Таким образом, интерфейс класса Sales_data
состоит из следующих операций.
• Функция-член isbn()
, возвращающая ISBN объекта.
• Функция-член combine()
, добавляющая один объект класса Sales_data
к другому.
• Функция add()
, суммирующая два объекта класса Sales_data
.
• Функция read()
, считывающая данные из потока istream
в объект класса Sales_data
.
• Функция print()
, выводящая значение объекта класса Sales_data
в поток ostream
.