Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_OOP.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
4 Mб
Скачать

2. Определение класса. Сокрытие информации.

Определение класса базируется на понятии структуры и имеет вид

class имя_класса {тело_класса};

Тело класса содержит определение данных класса (член-данных) и объявление или определение функций, их обрабатывающих (член-функций). По иной терминологии член-данные – свойства, член-функции – методы.

Например, определим класс String:

const int MS = 255;

class String

{char line[MS];

int len;

void Fill(const char *); // объявление

int Length() {return len;} // определение

void Print() {cout << “\n Строка:” << line;} // определение

char & Index(int i); // объявление

};

Здесь член-данные – line, len; член-функции – Fill( ), Print( ), Length( ), Index( ).

Член-функции отличаются от обычных функций следующим:

а) они имеют привилегированный доступ к член-данным класса, то есть используют их непосредственно

б) область их видимости (действия) – класс, то есть они могут использоваться только с переменными этого класса.

Член-данные могут располагаться в любом месте описания класса, они “видны” всем член-функциям.

Но таким образом определенный класс использовать не сможем. Единственное, что можно сделать – определить переменные этого типа или указатель.

Например,

String str1,*str;

Но запись str1.len = 10 вызовет сообщение об ошибке

‘String::len’ is not accesible - «Переменная len из класса String недоступна».

Для того, чтобы работать с классом, для его член-данных и член-функций надо определить тип доступа.

Существуют 3 типа доступа:

private член-данные и член-функции доступны только член-функциям класса;

protected – член-данные и член-функции доступны член-функциям базового и порожденного классов;

public член-данные и член-функции общедоступны.

Обычно большую часть член-данных размещают в части private (сокрытие информации инкапсуляция), а большую часть член-функций – в части public (интерфейс с программой). Для классов по умолчанию считается доступ – private (поэтому в нашем примере оказался тип доступа private, то есть всё как бы спрятано в “капсулу”), для структур, наоборот, – public.

Итак, поставим перед первой функцией public: и тогда определение класса String примет следующий вид:

const int MS = 255;

class String

{char line[MS];

int len;

public:

void Fill(const char *); // объявление

int Length() {return len;} // определение

void Print() {cout << “\n Строка:” << line;} // определение

char & Index(int i); // объявление

};

В этом случе в программе можно определить оператор

int x = str1.Length();

который вернет длину строки str1, определенной выше.

Описания private и public могут стоять в любом месте описания класса и повторяться.

Теперь вернемся к член-функциям: две из них определены, две объявлены. Определить объявленные функции вне класса можно, используя операцию области видимости ‘::’.

Формат определения:

тип_возвращаемого_знач-я имя_класса:: имя_ф-ции(список_арг-в)

{тело_функции}

Например,

void String:: Fill(const char * s)

{for(len = 0; line[len] != ‘\0’; line[len] = s[len], len++);

line[len] = ‘\0’;}

char & String:: Index(int i)

{...}

Чем отличаются член-функции, определенные внутри тела класса и вне его? Отличие в том, что внутри класса они получают неявно статус inline (Поэтому, если функция определена внутри класса и содержит операторы цикла, компилятор выдаст предупреждение). Член-функциям, определенным вне класса, также можно присвоить статус inline явно первым словом

inline char & String:: Index(...) {...}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]