- •Вопрос 1. Ссылки и ссылочные параметры.
- •Вопрос 2. Перегрузка функций.
- •Вопрос 3. Шаблоны функций.
- •Вопрос 4. Использование const с указателями.
- •Вопрос 5. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации.
- •Вопрос 6. Понятие конструктора .Использование констр-ра с аргументами по умолчанию. Конструктор по умолчанию.
- •Вопрос 7. Понятие деструктора. Когда вызывается конструктор и деструктор.
- •Вопрос 8. Константные объекты и функции-члены.
- •Вопрос 9. Дружественные функции и друж. Классы.
- •Вопрос 10. Указатель this.
- •Вопрос 11. Операции new и delete.
- •Вопрос 12. Статические члены класса.
- •Вопрос 13. Понятие перегрузки операций.
- •Вопрос 14. Функции-операции как члены класса и как друж-е функции
- •Вопрос 15. Перегрузка операций ввода/вывода в поток, бинар и унар операций.
- •Вопрос 17. Перегрузка операций индексации массива.
- •Вопрос 18. Понятие наследования. Механизм ограничения доступа при наследовании.
- •Вопрос 19. Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •Вопрос 21. Конструкторы и деструкторы в производных классах.
- •Вопрос 22. Неявное преобразование объектов производных классов в объекты базового класса.
- •Вопрос 23. Иерархия классов. Уровни наследования.
- •Вопрос 24. Множественное наследование.
- •Вопрос 25. Неопределённость при множ-м наследовании. Включение «классы в классах».
- •Вопрос 26. Понятие виртуальной функции.
- •Вопрос 27. Понятие полиморфизма.
- •Вопрос 28. Абстрактные и конкретные базовые классы.
- •Вопрос 29. Статическое и динамическое связывание.
- •Вопрос 30. Виртуальные деструкторы.
- •Вопрос 31. Шаблоны классов.
- •Вопрос 32. Шаблоны классов и пользовательские типы
- •Вопрос 33. Шаблоны и наследование.
- •Вопрос 34. Классы и объекты потоков ввода/вывода. Иерархия потоковых классов.
- •Вопрос 35, 38. Предопределённые потоковые объекты. Состояние ошибок потока.
- •Вопрос 36. Манипуляторы потоков.
- •Вопрос 37. Неформатированный ввод/вывод с помощью read/ write
- •Вопрос 38. Состояние ошибок ввода/вывода
- •Вопрос 39. Понятие исключения. Когда должна использоваться обработка исключений.
- •Вопрос 40. Генерация исключений. Повторная генерация исключений.
- •Вопрос 41. Перехват исключений.
- •Вопрос 42. Спецификация исключений. Обработка неожиданных исключений.
- •Вопрос 43. «Раскручивание» стека. Иерархия исключений стандартной библиотеки.
- •Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.
- •Вопрос 45. Обработка неуспешного выполнения new.
- •Вопрос 46. Класс auto_ptr и динамич выделение памяти.
- •Вопрос 47. Static_cast, reinterpret_cast
- •Вопрос 48. Инфо о типе времени выполнения. Оператор dynamic_cast
- •Вопрос 49. Ключевое слово explicit.
- •Вопрос 50. Ключевое слово mutable.
- •Вопрос 51. Указатели на члены класса.
- •Вопрос 52. Множественное наследование. Виртуальные базовые классы.
- •Вопрос 53. Классы-контейнеры и классы-итераторы.
- •Вопрос 54. Понятие ооп. Три условия ооп-программы. Парадигмы ооп.
- •Вопрос 55.Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность.
- •Вопрос 56. Основные составляющие объектного подхода: иерархия, типизация, полиморфизм.
- •Вопрос 57. Природа объекта. Состояние, поведение, идентичность объекта.
- •Вопрос 58. Отношения между объектами. Связи. Агрегация.
- •Вопрос 59. Природа классов. Отношения между классами. Типы отношений.
Вопрос 49. Ключевое слово explicit.
Ключевое слово explicit используется для отключения семантики преобразования, когда конструктор с одним аргументом не используется для преобразования.
Вопрос 50. Ключевое слово mutable.
Если член класса объявлен со словом mutable, то он может быть переопределён. Это означает, что члены с ключ словом mutable константного объекта не являются константными и могут быть модифицированы.
// mutable.cpp
class X
{
public:
bool GetFlag() const
{
m_accessCount++;
return m_flag;
}
private:
bool m_flag;
mutable int m_accessCount;
};
int main()
{
}
Вопрос 51. Указатели на члены класса.
Доступ к члену объекта можно получить ч-з указатель на этот объект. В этом случае применяется оператор -> . Указатель на объект объявляется точно так же, как и указатель на переменную любого другого типа. Задается имя класса этого объекта, затем имя переменной со * перед ним. Для получения адреса объекта перед ним необходим оператор &. Как и для любого другого указателя, если вы ++ указатель на объект, он будет указывать на следующий объект того же типа.
// Указатели на объекты
class samp {
int a, b;
public:
samp(int n, int m) { a = n; b = m; }
int get_a() { return a; }
int get_b() { return b; } };
int main()
{ samp ob[4] = {
samp(1, 2),
samp(3, 4),
samp(5, 6),
samp(7, 8)
};
int i;
samp *p;
p = ob; // получение адреса начала массива
for(i=0; i<4; i++) {
cout << p->get_a() << ' ';
cout << p->get_b() << "\n";
p++; // переход к следующему объекту
}
cout << "\n";
return 0;
}
Вопрос 52. Множественное наследование. Виртуальные базовые классы.
Класс может порождаться более, чем от одного базового класса; такое порождение называется множественным наследованием. Множественное наследование означает, что производный класс наследует эл-ты нескольких базовых классов. Для этого используется список базовых классов, в к-ом каждый из базовых классов отделён от других запятой. Множ-ное наследование указывается двоеточием (:) после имени класса с последующим перечислением ч/з запятую базовых классов.
class X{};
class Y{};
class Z : public X, public Y{};
поскольку класс Z наследует оба класс X и Y, то он имеет доступ к публичным и защищённым членам обоих классов X и Y.
Конструкторы базовых классов вызываются слева направо; деструкторы – наоборот.
Существуют две специфические для множ-ного наследования проблемы:
** как разрешить конфликты имен м/у суперклассами
** что делать с повторным наследованием.
Для устранения конфликта разрешается добавить к именам префиксы, указывающие имена классов, откуда они пришли.
Виртуальные базовые классы.
В ситуации, когда один производный класс косвенно может наследовать один и тот же базовый класс ч/з другие базовые классы, например: наследуемый класс A находится и в наследуемом классе B, используются виртуальные базовые классы.
В этом случае, один базовый класс косвенно наследуется в одном производном классе и наследуется с атрибутом virtual, поэтому в экземпляр производного класса будет помещена только одна копия базового класса. Базовый класс объявляется как виртуальный только при наследовании - в списке базовых классов с указанием спецификатора virtual. В данном случае, если базовый класс наследуется производным как виртуальный, то его компоненты все равно доступны в производном классе.
Отличие м/у обычным и виртуальным наследованием:
когда класс наследует базовый класс более одного раза, то он будет содержать только одно вхождение базового класса.
Пример:
При виртуальном наследовании базовых классов в первую очередь вызываются конструкторы виртуальных базовых классов в порядке наследования (первым будет вызван конструктор виртуального класса А, затем конструктор виртуального класса С, затем конструктор базового класса B) и последним будет вызван конструктор производного класса. Деструкторы вызываются в обратном порядке.
В(базовый) -> A(наследуемый) -> C(наследуемый виртуально)
