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

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


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; // месяц года

  int d; // день месяца

};


Date today; // переменная типа Date (именованный объект)


Объект типа Date, например today, может просто состоять из трех чисел типа int.



Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже