- •Конспект по "Объектно-ориентированному программированию".
- •1. Что такое объект? Понятия "состояние" и "поведение"?
- •2. Понятия "интерфейс" и "реализация"?
- •3. Понятия "класс" и "абстрактный тип данных"?
- •4. Основные категории классов?
- •5. Объявление класса? Общий вид объявления класса? Включение кода метода внутри объявления класса?
- •6. Особенности локальных классов?
- •7. Понятие inline-метода. Способы создания?
- •9. Константный объект? Константный метод?
- •10. Конструктор. Его назначение и синтаксические конструкции вызова конструктора?
- •11. Конструктор копирования. Общий вид и случаи вызова?
- •12. Что называется конструктором по умолчанию? Конструктором преобразования?
- •13. Основные свойства и правила использования конструкторов.
- •14. Деструктор. Вызов деструкторов (автоматический и явный).
- •15. Основные свойства и правила использования деструкторов.
- •16. Создание и уничтожение объектов.
- •17. Что такое наследование?
- •18. Понятия "базовый класс" и "производный класс"?
- •19. Принцип подстановки. Различие между понятиями "подкласс" и "подтип"?
- •20. Основные формы наследования?
- •21. Преимущества наследования?
- •22. Недостатки наследования?
- •23. Общая форма наследования классов? Спецификаторы доступа при наследовании?
- •24. Конструкторы и деструкторы производных классов? Порядок вызова конструкторов и деструкторов при множественном наследовании?
- •25. Множественное наследование. Общая форма?
- •26. Передача параметров в базовый класс. Назначение. Общая форма?
- •27. Указатели и ссылки на производные классы?
- •28. Виртуальная функция. Объявление виртуальной функции?
- •29. Чисто виртуальная функция. Общая форма чисто виртуальной функции?
- •30. Понятие "абстрактный класс".
- •31. Что такое полиморфизм? в каких формах он может существовать?
- •32. Понятие "перегрузка"?
- •33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?
- •34. Понятие "параметрическая перегрузка"?
- •35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?
- •36. В чем заключается процесс уточнения?
- •37. Что такое шаблоны (или обобщенные функции)? Их назначение?
- •38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?
- •39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
Классы-шаблоныполезны тогда, когда класс содержит логику, допускающую значительные обобщения.
Общая форма объявления класса-шаблона имеет следующий вид:
template <class параметр-тип> class имя_класса
{
. . . // тело класса
}
Где параметр-тип– это параметр-тип, который указывается при создании экземпляра класса.
После создания класса-шаблона можно создать конкретный экземпляр этого класса, используя следующую общую форму:
имя_класса <тип> объект;
Где тип – это имя типа данных, с которым будет оперировать данный класс.
Например, создадим класс-шаблон, реализующий стандартный стек "последним вошел– первым вышел". Он может использоваться для реализации стека с произвольным типом данных.
#include<iostream.h>
#include<conio.h>
// создание класса-шаблона stack
template <class Stack_Type> class stack
{
Stack_Type stck[100];
int tos;
public:
stack();
~stack();
void push(Stack_Type i);
Stack_Type pop();
};
//функция-конструктор stack
template <class Stack_Type> stack<Stack_Type>::stack()
{
tos=0;
cout<<"Стек создан\n";
}
// функция-деструктор stack (в данном примере деструктор не реализуется)
template <class Stack_Type> stack<Stack_Type>::~stack()
{
cout<<"Стек уничтожен\n";
}
// помещение объекта в стек
template <class Stack_Type> void stack<Stack_Type>::push(Stack_Type i)
{
if (tos==100)
{
cout<<"Стек полон.\n";
return;
}
stck[tos]=i;
tos++;
}
// Извлечение объекта из стека
template <class Stack_Type> Stack_Type stack<Stack_Type>::pop()
{
if (tos==0)
{
cout<<"Стек пуст.\n";
return 0;
}
tos--;
return stck[tos];
}
int main()
{
clrscr();
stack<int> a; // создание стека типа int
stack<double> b; // создание стека типа double
stack<char> c; // создание стека типа char
int i;
// демонстрация работы целого и вещественного стеков
a.push(1);
b.push(99.3);
a.push(2);
b.push(-12.23);
cout<<a.pop()<<" "<<a.pop()<<" ";
cout<<b.pop()<<" "<<b.pop()<<"\n";
//демонстрация работы символьного стека
for (i=0; i<10; i++) c.push((char) 'A'+i);
for (i=0; i<10; i++) cout<<c.pop();
cout<<"\n";
return 0;
}
Объявление класса-шаблона похоже на объявление функции-шаблона. При объявлении конкретного экземпляра созданного класса-шаблона (в данном примере stack) компилятор автоматически генерирует все необходимые функции и данные для обработки фактических данных.
Можно создать стек, содержащий определенный тип данных.
Например, можно хранить адреса, используя следующую структуру:
struct address
{
char name[40];
char street[40];
char city[30];
}
Затем можно использовать класс stack(из предыдущего примера) для создания стека, в котором хранятся объекты типаaddress:
stack<address> obj;
Класс-шаблон может иметь несколько типов-шаблонов, объявленных в виде списка, разделенного запятыми.
Например:
// в данном примере используется два шаблона при определении класса
#include <iostream.h>
#include <conio.h>
template <class Type1, class Type2> class myclass
{
Type1 i;
Type2 j;
public:
myclass(Type1 a, Type2 b)
{
i=a;
j=b;
}
void show()
{
cout<<i<<" "<<j<<"\n";
}
};
int main()
{
clrscr();
myclass<int, double> ob1(10, 0.25);
myclass<char, char *> ob2('X', "Это – тест");
ob1.show(); // вывод int и double
ob2.show(); // вывод char и char *
return 0;
}
В программе объявляются два типа объектов ob1 иob2.
Объект ob1 использует типы данныхint и double, объектob2 –char и char *.
В обоих случаях компилятор автоматически генерирует необходимые данные и функции в соответствии с типом данных, которые передаются конструктору в качестве аргументов.