Чтение онлайн

ЖАНРЫ

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

В языке С++ (как и в большинстве современных языков) класс является основной строительной конструкцией в крупных программах, которая также весьма полезна для разработки небольших программ, как мы могли убедиться на примере калькулятора (см. главы 6 и 7).

9.2. Классы и члены класса

Класс — это тип, определенный пользователем. Он состоит из встроенных типов, других типов, определенных пользователем, и функций. Компоненты, использованные при определении класса, называются его членами (members).
Класс может содержать несколько членов, а может и не иметь ни одного члена. Рассмотрим пример.

class X {

public:

int m; // данные - члены

int mf(int v) { int old = m; m=v; return old; } // функция - член

};

Члены класса могут иметь разные типы. Большинство из них являются либо данными-членами, определяющими представление объекта класса, либо функциями-членами, описывающими операции над такими объектами. Для доступа к членам класса используется синтаксическая конструкция вида объект.член. Например:

X var; // var — переменная типа X

var.m = 7; // присваиваем значение члену m объекта var

int x = var.mf(9); // вызываем функцию - член mf объекта var

Тип члена определяет, какие операции с ним можно выполнять. Например, можно считывать и записывать член типа

int
, вызывать функцию-член и т.д.

9.3. Интерфейс и реализация

Как правило, класс имеет интерфейс и реализацию. Интерфейс — это часть объявления класса, к которой пользователь имеет прямой доступ. Реализация — это часть объявления класса, доступ к которой пользователь может получить только с помощью интерфейса. Открытый интерфейс идентифицируется меткой
public:
, а реализация — меткой
private:
. Итак, объявление класса можно представить следующим образом:

class X { // класс имеет имя X

public:

// открытые члены:

// – пользовательский интерфейс (доступный всем)

// функции

// типы

// данные (лучше всего поместить в раздел private)

private:

// закрытые члены:

// – детали реализации (используется только членами

// данного класса)

// функции

// типы

// данные

};

Члены класса по умолчанию являются закрытыми. Иначе говоря, фрагмент

class X {

int mf(int);

// ...

};

означает

class X {

private:

int mf(int);

// ...

};

поэтому

X x; //
переменная x типа X

int y = x.mf; // ошибка: переменная mf является закрытой

// (т.е. недоступной)

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

class X {

int m;

int mf(int);

public:

int f(int i) { m=i; return mf(i); }

};

X x;

int y = x.f(2);

Различие между закрытыми и открытыми данными отражает важное различие между интерфейсом (точка зрения пользователя класса) и деталями реализации (точка зрения разработчика класса). По мере изложения мы опишем эту концепцию более подробно и рассмотрим множество примеров. А пока просто укажем, что для обычных структур данных это различие не имеет значения. По этой причине для простоты будем рассматривать класс, не имеющий закрытых деталей реализации, т.е. структуру, в которой все члены по умолчанию являются открытыми. Рассмотрим пример.

struct X {

int m;

// ...

};

Он эквивалентен следующему коду:

class X {

public:

int m;

// ...

};

Структуры (

struct
) в основном используются для организации данных, члены которых могут принимать любые значения; иначе говоря, мы не можем определить для них никакого осмысленного инварианта (раздел 9.4.3).

9.4. Разработка класса

Проиллюстрируем языковые свойства, поддерживающие классы и основные методы их использования, на примере того, как — и почему — простую структуру данных можно преобразовать в класс с закрытыми деталями реализации и операциями.

Рассмотрим вполне тривиальную задачу: представить календарную дату (например, 14 августа 1954 года) в программе. Даты нужны во многих программах (для проведения коммерческих операций, описания погодных данных, календаря, рабочих записей, ведомостей и т.д.). Остается только вопрос: как это сделать?

9.4.1. Структуры и функции

Как можно представить дату? На этот вопрос большинство людей отвечают: “Указать год, месяц и день месяца”. Это не единственный и далеко не лучший ответ, но для наших целей он вполне подходит. Для начала попробуем создать простую структуру.

// простая структура Date (слишком просто?)

struct Date {

int y; // год

int m; // месяц года

Поделиться с друзьями: