- •Оглавление
- •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. Паттерны проектирования: Шаблонный метод.
8. Использование операции :: для доступа к элементам класса и глобальным функциям и переменным
Программа с точки зрения ООП является совокупностью взаимодействующих между собой объектов. Объект представляет собой конкретный опознаваемый предмет, единицу или сущность (реальную или абстрактную), имеющую четко определенное функциональное назначение в данной предметной области. Каждый объект обладает состоянием, поведением и идентичностью и является экземпляром некоторого класса. Класс – это множество объектов, имеющих схожую структуру и поведение. Класс является абстрактным типом данных, определяемым пользователем, и представляет собой описание реального объекта в виде данных и операций для работы с ними. Данные-элементы класса называются полями, в них хранится текущее состояние объекта. Операции могут быть реализованы как методы (функции-элементы) или обычные функции. Операции могут быть следующих видов:
конструктор служит для инициализации объекта;
деструктор необходим для освобождения используемых объектом ресурсов;
селектор позволяет считать состояние объекта, не изменяя его;
модификатор используется для изменения состояния объекта;
итератор позволяет получить доступ к частям объекта в некотором порядке.
Синтаксис: class имя класса { элементы класса }; или struct имя класса { элементы класса }; С помощью спецификаторов доступа можно управлять видимостью элементов класса. Спецификатор private (закрытый) означает видимость элементов только для методов и друзей класса. Спецификатор protected (защищенный) означает видимость элементов только для методов и друзей класса и его наследников (наследники могут видеть эти элементы только в объектах собственного типа). Спецификатор public (открытый) означает видимость элементов из любого кода. Действие любого спецификатора распространяется до следующего спецификатора или до конца объявления класса. По умолчанию для элементов класса, объявленного с помощью struct, установлен доступ public, а для класса, объявленного с помощью class, –private. Рекомендуется все поля в class делать закрытыми или защищенными элементами, а в struct – открытыми. Пример объявления класса:
const int Stack_size=100; // размер стека
class Stack {
int s[Stack_size]; // поля в закрытом разделе
int t;
public:
void clear(); // методы в открытом
bool isEmpty();
bool isFull();
void pop();
int top();
void push(int);
};
8. Объявление класса обычно помещается в заголовочном файле (.h), а сами методы определяются в файле реализации (.cpp). Определения простых методов можно поместить в объявление класса, в этом случае они будут считаться определенными со спецификатором inline. При определении методов вне интерфейса класса непосредственно перед именем метода необходимо указать имя класса и символы :: Пример объявления класса:
const int Stack_size=100; // размер стека
class Stack {
int s[Stack_size];
int t;
public:
void clear() { t=-1; } // встраиваемые методы
bool isEmpty() { return t==-1; }
bool isFull() { return t==Stack_size-1; }
void pop();
int top();
void push(int);
};
class StackEmpty {}; // классы для информирования об ошибках
class StackFull {};
Реализация методов класса:
void Stack::pop()
{ if(!isEmpty())
--t;
}
int Stack::top()
{ if(isEmpty())
throw StackEmpty(); // сообщаем об ошибке
return s[t];
}
void Stack::push(int v)
{ if(isFull())
throw StackFull(); // сообщаем об ошибке
s[++t]=v;
}
При вызове метода сначала указывают имя объекта, затем после точки указывают имя метода и список аргументов в скобках. При использовании указателя на объект, вместо точки используют операцию -> Пример вызова методов:
int main()
{
Stack s1;
s1.clear();
s1.push(10);
cout<<s1.top()<<"\n";
s1.pop();
...
Stack *s2;
s2=new Stack;
s2->clear();
s2->push(10);
cout<<s2->top()<<"\n";
s2->pop();
...
}
Адрес объекта, к которому примеряется метод, передается с помощью скрытого параметра и доступен внутри метода под именем this. С помощью указателя this можно также обратиться к полю при совпадении имени поля и имени параметра метода. Другой вариант решения этой проблемы – написать имя класса и :: перед именем поля.
struct time {
int h,m;
void set(int h, int m)
{
this->h=h;
time::m=m;
}
};
