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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 92 93 94 95 96 97 98 99 100 ... 337
С++ (как и в большинстве современных языков) класс является основной строительной конструкцией в крупных программах, которая также весьма полезна для разработки небольших программ, как мы могли убедиться на примере калькулятора (см. главы 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; // месяц года

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

};

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

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

В данном случае нет необходимости скрывать данные, на которых основана структура Date, — это предположение будет использовано во всех вариантах этой структуры на протяжении всей главы. Итак, теперь у нас есть объекты типа Date; что с ними можно делать? Все что угодно, в том смысле, что мы можем получить доступ ко всем членам объекта today (и другим объектам типа Date), а также читать и записывать их по своему усмотрению. Загвоздка заключается в том, что все это не совсем удобно. Все, что мы хотим делать с объектами типа Date, можно выразить через чтение и запись их членов. Рассмотрим пример.

// установить текущую дату 24 декабря 2005 года

today.y = 2005;

today.m = 24;

today.d = 12;

Этот способ утомителен и уязвим для ошибок. Вы заметили ошибку? Все, что является утомительным, уязвимо для ошибок! Например, ответьте, имеет ли смысл следующий код?

Date x;

x.y = –3;

x.m = 13;

x.d = 32;

Вероятно нет, и никто не стал бы писать такую чушь — или стал? А что вы скажете о таком коде?

Date y;

1 ... 92 93 94 95 96 97 98 99 100 ... 337
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп.
Книги, аналогичгные Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Оставить комментарий