Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Властивості класів,,,.docx
Скачиваний:
5
Добавлен:
26.10.2018
Размер:
252.91 Кб
Скачать

3.4 Розробка класів

Класи розробляються для досягнення певної мети. Найчастіше програміст починає з нечітко обкресленої ідеї, яка поступово, у міру розробки проекту, поповнюється деталями. Іноді справа закінчується декількома класами, вельми схожими один на одного. Щоб уникнути подібного дублювання код в класах, слід розбити їх на дві частини, визначивши загальну частину в батьківському класі, а що відрізняються залишити в похідних.

Оголошення класу повинне передувати його використанню. Як правило, прикладний програміст користується готовими базовими класами, причому йому зовсім не обов'язково розбиратися у всіх специфікаціях і у внутрішній реалізації. Проте, щоб використовувати базовий клас C++, треба обов'язково знати які члени даних і методи вам доступні (а якщо застосовується компонент C++Builder - властивості, що ще надаються, і події).

3.4.1 Оголошення базового класу

C++Builder дає вам можливість оголосити базовий клас, який інкапсулює імена своїх властивостей, даних, методів і подій. Окрім здатності виконувати своє безпосереднє завдання об'єктні методи отримують певні привілеї доступу до значень властивостей і даних класу.

Кожне оголошення усередині класу визначає привілей доступу до імен класу залежно від того, в якій секції ім'я з'являється. Кожна секція починається з одного з ключових слів: private, protected і public. Лістинг 3.1 ілюструє узагальнений синтаксис оголошення базового класу.

class className

 

private:

<приватні члени даних> <приватні конструктори> <приватні методи>

protected:

<захищені члени даних> <захищені конструктори> <захищені методи>

public:

<загальнодоступні властивості> <загальнодоступні члени даних> <загальнодоступні  конструктори> <загальнодоступна деструкція> <загальнодоступні методи>

Лістинг 3.1. Оголошення базового класу.

Таким чином, оголошення базового класу на C++ надає наступні права доступу і відповідні зони видимості:

• Приватні private імена мають найбільш обмежений доступ, дозволений тільки методам даного класу. Доступ похідних класів до приватних методів базових класів заборонений.

• Захищені protected імена мають доступ, дозволений методам даного і похідних від нього класів.

• Загальнодоступні public імена мають необмежений доступ, дозволений методам всіх класів і їх об'єктів.

Наступні правила застосовуються при утворенні різних секцій оголошення класу:

1. Секції можуть з'являтися у будь-якому порядку, а їх назви можуть зустрічатися повторно.

2. Якщо секція не названа, компілятор вважає подальші оголошення імен класу приватними. Тут виявляється відмінність оголошень класу і структури - остання розглядається за умовчанням як загальнодоступна.

3. В міру можливості не поміщайте члени даних в загальнодоступну секцію, якщо тільки ви дійсно не хочете вирішити доступ до них звідусіль. Зазвичай їх оголошують захищеними, щоб вирішити доступ тільки методам похідних класів.

4. Використовуйте методи для вибірки, перевірки і установки значень властивостей і членів даних.

5. Конструктори і деструкції є спеціальними функціями, які не повертають значення і мають ім'я свого класу. Конструктор будує об'єкт даного класу, а деструкція його видаляє.

6. Методи (так само як конструктори і деструкції), які містять більше ніж одну інструкцію C++, рекомендується оголошувати поза класом.

Лістинг 3.2 представляє спробу наповнити оголошення базового класу деяким конкретним змістом. Відзначимо характерне для компонентних класів C++Builder оголошення властивості Count в захищеній секції, а методу SetCount, що реалізовує запис в член даних FCount, - в приватній секції.

class TPoint { private:

int FCount; // Приватний член даних void _fastcall SetCount(int Value);

protected:

 

_property int  Count = // Захищена властивість

{ read= FCount, write=SetCount };

 

double x;  // Захищений член даних

double у; // Захищений член даних public:

TPoint(double xVal double yVal); // Конструктор |

double getX(); |

 

double  getY() ;

Лістинг 3.2. Оголошення базового компонента TPoint.

Оголошення і визначення методів зберігаються в різних файлах (з розширеннями .h і .срр, відповідно). Лістинг 3.3 показує, що коли методи визначаються поза класом, їх імена слід кваліфікувати. Синтаксис такої кваліфікації методу, що визначає його зону видимості, має наступний вигляд:

<ім'я класу>::<ім'я методу>

TPoint::TPoint(double xVal double yVal)

( // Тіло конструктора

void _fastcall TPoint::SetCount( int Value )

{

l

if ( Value i= FCount ) // Нове значення члена даних? {

FCount = Value; // Запис нового значення Update(); // Виклик методу Update } }double TPoint::getX()

// Тіло методу getX, кваліфікованого в класі ^TPoint

}

Лістинг 3.3. Визначення конструктора і методів поза класом.

Після того, як ви оголосили клас, його ім'я можна використовувати як ідентифікатор типу при оголошенні об'єкту цього класу (наприклад,

TPoint* MyPoint;).