- •Введение. Принципы объектно-ориентированного программирования
- •Глава 1. Классы и объекты
- •1.1. Операция разрешения области видимости ::
- •1.2. Перечислимый тип
- •1.3. Модификатор const
- •1.4. Новый тип данных – ссылка &
- •Inline определение_функции
- •2. Определение класса. Сокрытие информации.
- •3. Объект.
- •4. Конструкторы и деструкторы
- •4.1.Назначение конструктора
- •4.2. Конструктор копирования
- •X::X(X&); // где X – имя класса
- •4.3. Деструктор
- •5. Неявный указатель this
- •6. Перегрузка операций
- •7. Примеры перегрузки некоторых операций
- •7.1. Перегрузка операции [ ]
- •7.2. Перегрузка операции ()
- •7.6. Перегрузка операции (тип)
- •8. Дружественность
- •Istream
- •10. Массивы объектов.
- •11. Функции- и классы-шаблоны
- •11.1 Функции-шаблоны (родовые функции)
- •11.2 Классы-шаблоны
- •12. Член-данные класса – объекты другого класса: агрегированные классы.
- •Глава 2. Наследование. Полиморфизм
- •1. Базовый и порожденный классы
- •2. Конструкторы порожденного класса
- •3. Стандартные преобразования при наследовании
- •4. Множественное наследование. Виртуальный базовый класс
- •4.1. Прямые базовые классы
- •4.2. Виртуальный базовый класс
- •5. Полиморфизм, раннее и позднее связывание, виртуальные функции
- •5.1 Раннее (статическое) и позднее (динамическое) связывание
- •5.2. Определение виртуальной функции
- •5.3. Чистая виртуальная функция и абстрактный класс
- •5.4. Правила определения виртуальных функций
- •5.5. Механизм позднего связывания
- •6. Библиотека fstream – работа с файлами
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
- •1. Контейнер. Структура бсш.
- •2. Контейнер Vector – динамический массив
- •Контейнер list – список
- •4. Контейнер Set – множество
- •Содержание
- •Глава 1. Классы и объекты
- •Глава 2. Наследование. Полиморфизм
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
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(...) {...}
