ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 6) онлайн

Определение класса

Определение класса smallobj в приведенной выше программе выглядит следу- ющим образом:

class smallobj    // определение класса

{

private:

  int somedata; // поле класса

public:

void setdata(int d)    // метод класса, изменяющий значение поля   { somedata =d; }

void showdata()              // метод класса, отображающий значение поля

  { cout << "Значение поля равно " << somedata << endl;}

 };

 

Определение начинается с ключевого слова class, за которым следует имя класса; в данном случае этим именем является smallobj. Подобно структуре, тело класса заключено в фигурные скобки, после которых следует точка с запятой (;) (не забывайте ставить этот знак. Конструкции, связанные с типами данных, такие, как структуры и классы, требуют после своего тела наличия точки с за- пятой, в отличие от конструкций, связанных с передачей управления, например функций и циклов).

private и public

Тело класса содержит два не встречавшихся раньше ключевых слова: private и public. Сейчас мы раскроем их смысл.

Ключевой особенностью объектно-ориентированного программирования яв- ляется возможность сокрытия данных. Этот термин понимается в том смысле, что данные заключены внутри класса и защищены от несанкционированного доступа функций, расположенных вне класса. Если необходимо защитить какие- либо данные, то их помещают внутрь класса с ключевым словом private. Такие данные доступны только внутри класса. Данные, описанные с ключевым словом public, напротив, доступны за пределами класса. Вышесказанное проиллюстри- ровано на рис. 6.2.

Зачем скрывать данные?

Не путайте сокрытие данных с техническими средствами, предназначенными для защиты баз данных. В последнем случае для обеспечения сохранности дан-

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

Класс

Рис. 6.2. Скрытые и общедоступные классы

Сокрытие данных в нашем толковании означает ограждение данных от тех частей программы, которые не имеют необходимости использовать эти данные. В более узком смысле это означает сокрытие данных одного класса от другого класса. Сокрытие данных позволяет уберечь опытных программистов от своих собственных ошибок. Программисты могут сами создать средства доступа к за- крытым данным, что значительно снижает вероятность случайного или некор- ректного доступа к ним.

Данные класса

Класс smallobj содержит всего одно поле данных somedata, имеющее тип int. Дан- ные, содержащиеся внутри класса, называют данными-членами или полями клас- са. Число полей класса, как и у структуры, теоретически может быть любым. По- скольку перед описанием поля somedata стоит ключевое слово private, это поле доступно только внутри класса.

Методы класса

Методы класса — это функции, входящие в состав класса. Класс smallobj содер- жит два метода: setdata() и showdata(). Тела обоих методов состоят из одного опе- ратора, который записан на одной строке с фигурными скобками, ограничива- ющими тело функции. Разумеется, можно использовать и более традиционный способ оформления функций:

void setdata(int d) {

  somedata = d;

}

и

void showdata() {

  cout << "\nЗначение поля равно " << somedata;

}

В тех случаях, когда тела методов невелики по размеру, имеет смысл исполь- зовать более сжатую форму их записи.

Поскольку методы setdata() и showdata() описаны с ключевым словом public, они доступны за пределами класса smallobj. Мы покажем, каким образом можно получить доступ к этим функциям, чуть позже. На рис. 6.3 показан синтаксис определения класса.

Рис. 6.3. Синтаксис определения класса

Сокрытие данных и доступность функций

Как правило, скрывая данные класса, его методы оставляют доступными. Это объясняется тем, что данные скрывают с целью избежать нежелательного внеш- него воздействия на них, а функции, работающие с этими данными, должны обеспечивать взаимодействие между данными и внешней по отношению к клас- су частью программы. Тем не менее, не существует четкого правила, которое бы определяло, какие данные следует определять как private, а какие функции — как public. Вы можете столкнуться с ситуациями, когда вам будет необходимо скры- вать функции и обеспечивать свободный доступ к данным класса.

Методы класса внутри определения класса

Методы класса smallobj выполняют действия, типичные для методов классов во- обще: они считывают и присваивают значения полям класса. Метод setdata() принимает аргумент и присваивает полю somedata значение, равное значению ар- гумента. Метод showdata() отображает на экране значение поля somedata.

Обратите внимание на то, что функции setdata() и showdata() определены внутри класса, то есть код функции содержится непосредственно в определении класса (здесь определение функции не означает, что код функции помещается в память. Это происходит лишь при создании объекта класса). Методы клас- са, определенные подобным образом, по умолчанию являются встраиваемыми (встраиваемые функции обсуждались в главе 5 «Функции»), Позже мы увидим,

 

что функции внутри класса можно не только определять, но и объявлять, а оп- ределение функции производить в другом месте. Функция, определенная вне класса, по умолчанию уже не является встраиваемой.

 

5