- •7)Понятие структурного программирования. Базовые конструкции структурного программирования. Оператор «выражения».
- •8)Операторы ветвления. Условный оператор if. Оператор switch.
- •10)Операторы передачи управления. Оператор goto. Оператор break. Оператор continue. Оператор return.
- •11) Указатели. Инициализация указателей. Операции с указателями. Ссылки.
- •12)Массивы. Динамические массивы. Строки.
- •13)Типы данных, определяемые пользователем. Переименование типов. Перечисление.
- •14)Типы данных, определяемые пользователем. Структуры. Битовые поля. Объединения.
- •15)Функции. Объявление и определение функций.
- •16)Способы обмена данными между функциями. Глобальные переменные. Возвращаемое значение. Параметры функции. Передача массивов в качестве параметров. Параметры со значениями по умолчанию.
- •17)Рекурсивные функции. Функция main().
- •18)Перегрузка функций.
- •19)Шаблоны функции.
- •20)Директивы препроцессора. Директива #include. Директива #define. Директива #undef.
- •21)Директива препроцессора. Директивы условной компиляции.
- •22)Основные свойства объектно-ориентированного программирования. Понятие класса.
- •23)Классы. Описание класса. Описание объекта. Константные методы. Указатель this.
- •24)Конструкторы. Конструктор копирования. Статические элементы класса.
- •25)Деструкторы. Дружественные функции и классы.
- •26)Перегрузка операций. Перегрузка бинарных и унарных операций.
- •27)Перегрузка операций. Перегрузка операции присваивания. Перегрузка операции приведения типа. Перегрузка операции индексирования.
- •28)Наследование. Ключи доступа к элементам базового класса. Простое наследование.
- •29)Виртуальные методы. Механизм позднего связывания.
- •30)Абстрактные классы. Множественное наследование.
- •31)Шаблоны классов. Создание шаблонов. Использование шаблонов класса.
- •35)Форматирование данных при вводе - выводе в поток. Флаги и манипуляторы.
- •38)Модель программирования для os Windows. Механизм обработки сообщений в Windows. Группы сообщений.
23)Классы. Описание класса. Описание объекта. Константные методы. Указатель this.
Класс является абстрактным типом данных, определяемых пользователем.
Данные класса принято называть полями, а функции класса - методами. Поля и методы составляют элементы класса.
Описание класса:
class Имя_Класса
{[private:]
// Описание скрытых элементов
...
public:
// Описание доступных элементов
...}; // Описание заканчивает точкой с запятой
Правила описания полей класса:
- поля могут иметь любой тип, кроме типа этого же класса
- поля могут быть описаны модификатором const или static, но не как auto, extern и register
- инициализация для полей при описании не допускается
Пример класса:
class monstr
{// Закрытые элементы класса (поля)
int health, ammo;
// Открытый программный интерфейс класса (методы)
public:
monstr(int he=100, int am=10)
{health=he; ammo=am;}
int get_health() {return health;}
int get_ammo() {return ammo;}
void draw(int x, int y, int scale, int position);};
Внешнее определение метода
void monstr:: draw(int x, int y, int scale, int position)
{/* тело метода */}
// встраиваемый метод
inline int monstr:: get_ammo()
{return ammo;}
Описание объектов.
Переменные типа "класс" называются экземплярами или объектами
monstr m;
monstr Super (200, 300);
monstr stado[100];
monstr km1=new monstr(10);
monstr &m2=Super;
При создании каждого объекта выделяется память, для хранения всех его полей, и автоматически вызывается конструктор, выполняющий инициализацию полей.
Методы класса существуют в памяти в единичном экземпляре и используются для всех объектов данного класса.
При выходе из области действия он уничтожается, при этом автоматически вызывается другой специальный метод класса - конструктор.
int n=m.get_ammo();
stado[5].draw(10,10,1,1);
cout<<m1->get_health();
Константные объекты и методы.
Значения полей константного объекта изменять запрещается. К нему должны применяться только константные методы.
class mostr
{...
int get_health() const {return health} };
const monstr Dead(0,0); // константный объект
cout<<Dead.get_health();
Константный метод сам может вызывать только константные методы, но может вызываться для любых (не только константных) объектов.
Указатель this
this - указатель на объект, который вызвал метод класса.
monstr& monstr:: TheBest(monstr &M)
{if (health>M.health) return *this;
else return M;}...
monstr Vasia(50), Super(200);
monstr Best=Vasia.TheBest(Super);
Обращение к полю класса через this
void monstr:: Cure(int health, int ammo)
{this->health+=health;
this->ammo+=ammo;}
24)Конструкторы. Конструктор копирования. Статические элементы класса.
Конструктор предназначен для инициализации объекта. Вызывается автоматически при его создании.
Основные свойства конструкторов:
- конструктор не возвращает значение, даже типа void
- класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации
- конструктор, не имеющий параметров, называется конструктором по умолчанию.
- параметры конструктора могут иметь любой тип, кроме типа этого же класса. Можно задавать значение параметров по умолчанию.
Свойства конструкторов:
- если программист не указал ни одного конструктора, компилятор автоматически создает конструктор по умолчанию
- конструкторы нельзя описывать с модификаторами const и static
- конструкторы глобальных объектов вызываются до вызова функции main
Пример перегрузки конструктора:
class monstr
{char *name;
...
public:
...
monstr (char *nam)
{name=new char[strlen(nam)+1];
strcpy(name, nam);
health=100; ammo=10;}};
...
monstr x(100);
monstr y("Ork");
Список инициализаторов:
monstr:: monstr(int he, int am)
: health(he), ammo(am)
{/* тело конструктора */}
Конструктор копирования.
Конструктор копирования - специальный вид конструктора, получающий в качестве единственного параметра ссылку на объект того же класса.
T:: T(const T&)
{/* тело конструктора */}
Конструктор копирования вызывается в тех случаях, когда новый объект создается путем копирования существующего:
- при описании нового объекта с инициализацией другим объектом
- при передаче объекта в функцию по значению
- при возврате объекта из функции
Пример конструктора копирования:
monstr:: monstr(const monstr &m)
{if (M.name != NULL)
{ name=new char[strlen(M.name+1)];
strcpy(name, M.name);}
else name=NULL;
health=M.health; ammo=M.ammo;}
monstr Super;
monstr Vasia=Super; // работает конструктор копирования
monstr *m=new monstr("Ork");
monstr x=*m; // работает конструктор копирования
Статически элементы класса.
Статические поля класса инициализируются в глобальной области с указанием имени класса и операции доступа к области видимости:
class A
{public:
static int count; // Объявление в классе};
...
int A:: count=10; // Определение в глобальной области
Статические поля доступа как через имя класса, так и через имя объекта:
A *a, b;
cout<<A::count<<a->count<<b.count;
Память, занимаемая статическим полем, не учитывается при определении размера объекта с помощью операции sizeof.
Статические методы:
Могут применяться или для обращения к статическим полям или просто как глобальные функции.
Из элементов класса они могут обращаться только к статическим полям и другим статическим методам класса, потому что им не передается скрытый указатель this
Пример:
class ABC
{static int count;
public:
static void int_count() {count ++;}};
int ABC:: count;
void func()
{ABC var; // var.count++ - нельзя
var.int_count(); } // или ABC:: int_count();
