
- •Оглавление
- •1. Спецификация const для данных. Назначение.
- •2. Спецификация inline для функций. Назначение.
- •4. Ссылки. Назначение, обращение к данным по ссылке, использование ссылок для параметров функции и возвращаемого значения.
- •5. Динамическое создание и уничтожение объектов. Можно ли операции new и delete использовать вместе с malloc и free?
- •6. Динамическое создание и уничтожение массивов объектов.
- •8. Использование операции :: для доступа к элементам класса и глобальным функциям и переменным
- •9. Спецификации const для методов, не изменяющих объект. Спецификация mutable для элементов данных.
- •10. Дружественные функции и классы.
- •11. Статические переменные класса. Определение и инициализация.
- •12. Статические методы класса.
- •13. Указатель this. Назначение.
- •14. Конструктор: назначение, объявление (синтаксис), момент выполнения.
- •15. Конструктор: инициализация базовых классов и данных объекта через список инициализации в конструкторе.
- •16. Конструктор по умолчанию: объявление (синтаксис), назначение.
- •17. Конструктор копий: объявление (синтаксис), назначение.
- •18. Деструктор: назначение, объявление (синтаксис), момент выполнения.
- •19. Констукторы-преобразователи и операции для преобразования, способ вызова. Спецификация explicit для конструкторов-преобразователей.
- •20. Шаблоны функций: определение (синтаксис), назначение. Как вызвать функцию-шаблон?
- •21. Шаблоны классов (параметризация): определение (синтаксис), назначение. Как создать объект шаблонного класса?
- •22. Специализация шаблонов.
- •23. Библиотека stl. Общая характеристика.
- •24. Перегрузка функций и методов, основные правила связывания.
- •25. Правила перегрузки операций
- •26. Формат перегрузки унарных и бинарных операций как методов и [дружественных] функций.
- •28. Перегрузка операций присваивания: назначение, объявление (синтаксис), действия выполняемые в методе.
- •29. Перегрузка операций [] и () : назначение, объявление (синтаксис).
- •31. Перегрузка операций new и delete в классе: назначение, объявление (синтаксис).
- •32. Исключительные ситуации: назначение и стандартные искл. Ситуации (кроме stl).
- •33. Исключительные ситуации: порождение и перехват (синтаксис).
- •34. Исключительные ситуации: спецификация порождаемых исключительных ситуаций в заголовке функции.
- •36. Чисто виртуальные функции и абстрактные классы.
- •37. Простое наследование: определение, синтаксис. Порядок выполнения конструкторов и деструкторов. Вызов методов, переопределенных в производном классе, из базового класса.
- •39. Операция typeid. Rtti.
- •40. Операция безопасного преобразования данных const_cast. Назначение, синтаксис вызова.
- •41. Операция безопасного преобразования данных static_cast. Назначение, синтаксис вызова.
- •42.Операция безопасного преобразования данных dynamic_cast. Назначение, синтаксис вызова.
- •43. Операция безопасного преобразования данных reinterpret_cast. Назначение, синтаксис вызова.
- •44. Пространства имен: назначение, определение (синтаксис), варианты использования имен из namespace в своей программе.
- •45. Какие методы должны быть определены в классе с динамическим выделением памяти для некоторых элементов данных?
- •46. Сложность программного обеспечения.
- •47. Пять свойств сложной системы.
- •48. Основные методы при создании сложных систем.
- •49. Основные положения оо подхода.
- •50. Концепции оо подхода: Абстрагирование.
- •51. Концепции оо подхода: Ограничение доступа.
- •52. Концепции оо подхода: Модульность
- •53. Концепции оо подхода: Иерархия.
- •54. Концепции оо подхода: Типизация.
- •55. Концепции оо подхода: Параллелизм.
- •56. Концепции оо подхода: Устойчивость (сохраняемость).
- •57. Объекты в ооп: Определение объекта.
- •58. Объекты в ооп: Состояние.
- •59. Объекты в ооп: Поведение. Операции.
- •60. Объекты в ооп: Уникальность (идентичность).
- •61. Объекты в ооп: Отношения между объектами.
- •62. Классы в ооп: Понятие класса, связь между объектами и классами.
- •63. Отношения между классами: Ассоциации.
- •64. Отношения между классами: Наследование.
- •65. Отношения между классами: Агрегация.
- •66. Отношения между классами: Использование.
- •67. Отношения между классами: Конкретизация (параметризованные классы).
- •68. Отношения между классами: Метаклассы.
- •69. Паттерны проектирования: Абстрактная фабрика.
- •70. Паттерны проектирования: Одиночка.
- •71. Паттерны проектирования: Прототип (виртуальный конструктор).
- •72. Паттерны проектирования: Адаптер.
- •73. Паттерны проектирования: Заместитель.
- •74. Паттерны проектирования: Компоновщик.
- •75. Паттерны проектирования: Декоратор.
- •76. Паттерны проектирования: Итератор.
- •77. Паттерны проектирования: Шаблонный метод.
28. Перегрузка операций присваивания: назначение, объявление (синтаксис), действия выполняемые в методе.
Перегрузка операции присваивания: a) для случая, когда перевыделения памяти не происходит
class BadSize {}; // класс для информирования об ошибке
class Vector {
const int size;
double *const data;
public:
Vector &operator=(const Vector &);
...
};
Vector & Vector::operator=(const Vector &v)
{ if(size!=v.size)
throw BadSize();
for(int i=0;i<size;++i)
data[i]=v.data[i];
return *this;
}
б) для случая, когда память перевыделяется
class String {
int len;
char * str;
public:
String &operator=(const String &);
...
};
String & String::operator=(const String &s)
{ String t(s); // создание копии
std::swap(len,t.len); // обмен состояний объекта t и *this
std::swap(str,t.str);
return *this; // объект t со старым состоянием *this уничтожается
}
29. Перегрузка операций [] и () : назначение, объявление (синтаксис).
Перегрузка операции индексирования:
class BadIndex {}; // класс для информирования об ошибке
class Vector {
const int size;
double *const data;
public:
double &operator[](int); // для неконстантных объектов
double operator[](int) const; // для константных объектов
...
};
double & Vector::operator[](int i)
{ if(i<0 || i>=size)
throw BadIndex();
return data[i];
}
double Vector::operator[](int i) const
{ if(i<0 || i>=size)
throw BadIndex();
return data[i];
}
int main()
{ Vector a(10); // вектор из 10 элементов
a[4]=a[5]*2; // изменяем элемент вектора
}
Перегрузка операции () для создания функционалов:
struct str_less { // функционал для сравнения двух строк
bool operator()(const char *a, const char *b)
{ return strcmp(a,b)<0;
}
};
int main()
{ char *s[100];
sort(s,s+100,str_less()); // использование функционала
}
Перегрузка операции () для индексации по двум или более ключам:
class Matrix {
public:
Matrix(int n, int m);
double &operator()(int i, int j);
double operator()(int i, int j) const;
};
int main()
{ Matrix a(10,10); // матрица 10x10
a(4,5)=1; // изменяем элемент матрицы
}
30. Перегрузка операций * и -> : назначение, объявление (синтаксис)
Перегрузка &, -> и *:
class A;
class Ptr { // умный указатель
public:
A *operator->();
A &operator*();
...
};
class A {
public:
Ptr operator&(); // создание умного указателя
...
};
31. Перегрузка операций new и delete в классе: назначение, объявление (синтаксис).
Реализовать выделение участков памяти одинакового размера из некоторого пула можно более эффективно, чем выделение участков памяти произвольного размера. Кроме того, при работе с участками памяти одинакового размера не возникает проблема фрагментации, когда свободная память делится на множество участков небольшого размера. Чтобы повысить эффективность программ, использующих динамические структуры данных, можно создать собственные варианты операций new и delete для выделения памяти под объекты некоторых классов, например, элементов списка. Эти операции определяются как статические методы класса, отдельно для одиночных объектов и массивов: static void *operator new(size_t, доп параметры); static void *operator new[](size_t, доп параметры); static void operator delete(void *, size_t); static void operator delete[](void *, size_t); Значения для дополнительных параметров можно указать при вызове new следующим образом: new (доп аргументы) тип(список выражений); Можно также перегрузить глобальную операцию new, указав дополнительные параметры. Глобальная операция new уже перегружена с дополнительным параметром типа void * (память не выделяется, а возвращается указанный адрес, используется для инициализации с помощью конструктора произвольного участка памяти, пример использования показан ниже) иnothrow_t (в случае ошибки не возникает исключительной ситуации bad_alloc, операция возвращает 0). Пример повторной инициализации объекта с помощью перегруженной формы оператора new и явного вызова деструктора:
Vector a(100);
... // действия с вектором размером 100
a.~Vector();
new(&a) Vector(200);
... // действия с вектором размером 200