Билет 26. Объектно-ориентированное программирование. Классы и объекты. Компоненты классов
Использование классов — основное отличие оо-программирования от структурного.
Класс — это производный структурный тип, введённый в программировании на основе уже существующих типов.
Объект — конкретные переменные типа.
ключ_класса имя_класса
{
список_компонентов;
};
ключ_класса — одно из служебных слов:
- class
- struct
- union
Определение класса заканчивается ;
Принадлежащие классу функции называют методами класса или компонентными функциями. Данные класса называют компонентными данными, полями данных или элементами данных класса.
Struct complex
{
double real;
}
Класс: все компоненты по-умолчанию закрыты.
Структура: все компоненты по-умолчанию открыты.
Билет 27. Инкапсуляция. Режимы доступа к элементам класса
Доступ определяется правами доступа, которые устанавливаются следующие:
- private(использование только функции данного класса)
- public
- protected
Private – устанавливается по-умолчанию для служебного слова class.
Public - -//- слова struct.
Protected – используются лишь при создании иерархии классов.
Union – использование в качестве ключа_класса приводит к экономии пространства в памяти и ещё некоторым интересным аспектам. Общедоступно, но изменяемо спецификаторами.
Инкапсуляция — скрытие данных внутри объекта.
:: - операция принадлежности, при объявлении своих прототипов.
Обращение к элементам объекта:
void drob::vvod(void)
{…}
drob y;
…
y.vvod();
Билет. Понятие наследования. Объявление классов при наследовании
Функция потомка перекрывает одноимённую функцию своего предка.
Формат объявления функции потомка:
class имя_потомка:
режим_доступа имя_предка
{
новые_элементы;
};
Для того, что бы элементы данных класса предка были доступны функциям класса потомка, этим элементам должен быть поставлен в соответствии режим доступа — protected.
Class имя_потомка::режим_доступа имя_потомка
{…};
Билет. Конструкторы и деструкторы. Их имена и объявления
Конструктор создан для инициализации компонентных данных и выделение динамической памяти под данные.
Диструктор освобождает выделенную память конструктором при удалении объекта.
Int, double,float...
Выделение и освобождение памяти происходит системой автоматически.
Конструктор и диструктор объявляются, как члены функции класса. Имя конструктора совпадает с именем класса, а имя диструктора начинается с ~имя_класса
Пример:
class str_oper
{char *string;
int string_len;
public:
str_oper(char *)//конструктор
{string=new char[string_len];}
~str_oper() //диструктор
{delete string;}
…
}
В основной программе обращения к конс. Или дистр. Нет. Их выполнение происходит автоматически.
Билет. Полиморфизм и перегрузка
Возможность использования функции(или операции) с одним и тем же именем применительно к разным наборам аргументов и операторов. Реализация выполнена через перегрузку.
Перегрузка — это расширения действия стандартных функций. Внутри класса допускается существование нескольких функций с одинаковыми именами, но различных типов результатов и наборами формальных параметров.
Компилятор автоматически выбирает подходящий вариант.
Пример:
…
int absolute::modul(int x)
{ return(abs(x)); }
double absolute::modul(double x)
{ return(fabs(x)); }
…
Перегрузка операций
Полиморфизм реализуется не только через механизм перегрузки, но и через перегрузку операции. Включается специальная функция, которая определяет действия, выполняемые этой операцией. Формат определения такой функции:
тип_возвращаемого_значения
оператор знак_операции(спецификации_параметров_операции)
{ тело_функции_операции; }
Пример:
#include<iostream.h>
#include<conio.h>
class vector
{
int x,y,z;
public:
vector operator+(vector t);
vector operator=(vector t);
void int (int mx, int my, int mz);
void show(void);
};
//Перегрузка операций+
vector vector::operator+(vector t)
{
vector temp;
temp.x=x+t.x;
temp.y=y+t.y;
temp.z=z+t.z;
return temp;
}
//Перегрузка операции=
vector vector::operator=(vector t)
{
x=t.x;
y=t.y;
z=t.z;
return *this;
}
void vector::init(int mx, int my, int mz)
{ x=mx; y=my; z=mz; }
void vector::Show(void)
{ cout<<x<<”, ”<<y<<”, ”<<z<<”\n”; }
void main()
{vector a,b,c;
clrscr():
a.init(1,2,3);
b.init(10,10,10);
a.show();
b.show();
c=a+b;
c.show();
c=a+b+c;
c.show();
c=b=a;
c.show();
b.show();
getch();
}