В языке С++ (как и в большинстве современных языков) класс является основной строительной конструкцией в крупных программах, которая также весьма полезна для разработки небольших программ, как мы могли убедиться на примере калькулятора (см. главы 6 и 7).
9.2. Классы и члены класса
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;
// ...
};