- •Введение. Принципы объектно-ориентированного программирования
- •Глава 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. Библиотека стандартных шаблонов (бсш). Контейнеры
Глава 1. Классы и объекты
1. Новые возможности языка С++
1.1. Операция разрешения области видимости ::
В языке С существует такое правило – глобальная переменная видна во всех функциях, расположенных ниже ее определения, если в них (функциях) нет переменной с таким же именем. Операция :: позволяет одновременно использовать и глобальную, и локальную переменные с одинаковыми именами.
Например,
int x = 1;
void F1()
{x++;} // x(глоб) = 2
void F2()
{ int x = 3;
cout << x; // x(лок) = 3
}
void F3()
{int x = 5, y;
y = ::x * x; // 2(глоб) * 5(лок)
cout << y; // y = 10
}
1.2. Перечислимый тип
Перечислимый тип позволяет, и задавать символьные константы, и определять тип данных, значения которых можно перечислить.
Например, описание
enum {FALSE, TRUE};
опеределяет две константы FALSE = 0, TRUE = 1.
int y;
if (x > 0) cout << TRUE; else cout << FALSE;
Можно задать тип данных, значения которых – FALSE и TRUE.
enum boolean {FALSE, TRUE};
Тогда можно определить функцию, возвращающую значение этого типа.
boolean FF(int x)
{if (x > 0) return TRUE;
return FALSE; }
Можно задать булевский массив
boolean a[20];
Значения переменных перечислимого типа необязательно меняются с 0.
Эти значения можно определить для каждого символьного имени.
Например,
enum {Up = 72, Left = 75, Right = 77, Down = 80}; // скэн-коды управляющих клавиш
С этими именами их удобно использовать для программирования игр или организации меню. Например,
char s;
s = getch();
if (s = = 0) // если символ – управляющий
switch(getch())
{case Up: ...;break;
case Down: ...;break;
case Left: ...;break;
case Right: ...;
}
1.3. Модификатор const
В языке С константу можно задать директивой define
#define Pi 3.14159
В языке С++ принято константу задавать модификатором
const тип имя = значение
const double Pi = 3.14159;
Такое задание позволяет компилятору контролировать типы ?констант. (данных.)
Константная переменная обязательно должна быть проинициализирована, и в дальнейшем ее менять не разрешается.
const double Pi; // ошибка
Pi = 9.8; // ошибка
Константными могут быть и указатели.
Ниже приведены примеры описаний и операторов правильной и ошибочной работы с ними.
const int nine = 9;
const int one = 1;
int number = 5, n = 7;
int * const u1 = &number; // указатель-константа, его значение нельзя менять
cout << *u1; // вывод 5
*u1 = 10; // новое значение переменной number
u1 = &n; // ошибка: значение константы-указателя u1 менять нельзя
const int * u2 = &nine; // указатель на константу, сам указатель не константа
*u2 = 7; // ошибка : константу ‘nine’ менять нельзя
const int * const u3 = &nine; // и указатель, и значение – константы, менять нельзя:
*u3 = 99; // ошибка: константу ‘nine’ менять нельзя
u3 = &number; // ошибка : константный указатель менять нельзя
Аналогичны правила работы с указателями на строки:
const char * s1 = “text”; // s1 – указатель на текст-константу, указатель не константа
s1[0] = ’T’; // ошибка: текст изменять нельзя
const char * t = ”ttt”;
s1 = t; // это верно, значение неконстантного указателя можно изменить
char * const s2 = ”текст”; // s2 – константный указатель
s2[0] = ’Т’; // верно: в данном случае константа – адрес строки, а текст менять можно
s2 = t; // ошибка: s2 – константный указатель – изменять нельзя
const char * const s3 = ”all - const!”; // Ничего изменить нельзя!
