
- •1. Типи знань і методи їх представлення.
- •2. Парадигми імперативного стилю. Підтримка в мовах програмування. Парадигма процедурності.
- •3. Парадигма модульности (локализации).
- •4. Парадигма атд.
- •5. Парадигма ооп.
- •7. Ефективний доступ до членів класу. Дружні функції та дружні класи.
- •8. Конструкторы и деструкторы.
- •9. Инициализация полей класса. Статические члены класса.
- •10. Наследование классов. Конструкторы базового класса.
- •11. Обмеження доступу до базового класу.
- •12. Множинне наслідування.
- •13. Виртуальные базовые классы.
- •14. Конкретные и абстрактные типы. Виртуальные функции.
- •15. Виртуальные деструкторы и «витруальные» конструкторы. Клонирование.
- •16. Посилання. Ініціалізація, використання, порівняння з покажчиками.
- •17. Перевантаження функцій.
- •18. Перевантаження унарних операцій.
- •19. Перевантаження бінарних операцій.
- •20. Параметризація типів за допомогою шаблонів.
- •21. Параметризація функцій за допомогою шаблонів.
- •22. Перетворення за допомогою конструкторів. Обмеження.
- •23. Перетворення за допомогою перетворюючих функцій.
- •24. Область видимости.
- •25. Пространства имен. Директива using.
- •27. Потоки. Віртуальні операції введення та виведення.
- •29. Узагальнені алгоритми та бібліотека стандартних шаблонів. Ітератори.
7. Ефективний доступ до членів класу. Дружні функції та дружні класи.
Class {public: void f();}; void c::f(){}; void main() {f();}
Если функция не встроенная, то параметры передаются в стек.
Если тело функции описывается в объявлении класса, то такая функция наз встроенной. При использовании этой функции в главной программе тело функции вставляется вместо вызова. Компилятор имеет возможность большей оптимизации текста. Нет операций со стеком.
Как встроенные следует использовать функции, сложность тела которых сравнима со сложностью стека. Для встроенных функций компилятор должен иметь исходный текст этой функции. Встроенную функцию можно не обязательно описывать в объявлении класса.
Любую функцию можно описать inline (т.е. и функции, которые не являются членами класса).
inline void c::f(){}
Void main(){g(par1, par2,…);} – порядок вычисления фактических параметров в С++ не фиксированный. Параметры вычисляются справа налево.
Функции-члены класса и не члены класса.
Class complex {public: complex operator+ (complex b);}; void f() (complex a,b,c; …;c=a+b; c=a+2;//если есть конструктор – все нормально c=2+a; //ошибка}
Управляет выбором операции операнд а. Если он complex, то компилятор ищет соотв операцию. В 3-м случае 2 управляет выбором операции. Такая операция не существует. Естественно членами класса делать операции, которые изменяют первый операнд. Предлагается:
class complex{ float Re,Im; public: complex operator+=(complex b){Re+=b.Re; Im+=b.Im; return *this;}}; //остальные функции нужно выносить из объявления.
Дружественные функции и дружественные классы.
Дружественная функция – это такая функция, которая объявляется в объявлении класса с описателем friend, который указывает на то, что функция имеет доступ ко всем полям соотв класса на уровне функции-члена класса.
Class C{public: friend void f();};
Обычное объявление функции-члена гарантирует: 1. Функция имеет право доступа к закрытой части объявления класса; 2. Функция находится в области видимости класса; 3. Функция должна вызываться для объекта класса (иметь указатель this).
Объявив функцию как static, мы придаем ей только первые два свойства. Объявив фн как friend, мы наделяем ее только 1 св-вом.
Пример: умножение мцы Matrix на вектор Vector. Данные объекты скрывают свое представление и обеспечивают полный набор операций для манипулирования объектами их типов. Однако наша процедура не м/б членом обоих классов. С др ст, мы не хотим открыть пользователю доступ к классам. Объявим operator* другом (friend) обоих классов:
class Matrix; class Vector{ float v[4];//…;friend Vector operator* (const Matrix&,const Vector&);}; class Matrix{Vector v[4];//…;friend Vector operator* (const Matrix&,const Vector&);}; Vector operator* (const Matrix&m,const Vector&v){Vector r; for (int i=0; i<4; i++) //r[i]=m[i]*v; {r.v[i]=0; for (int j=0; j<4; j++) r.v[i]+=m.v[i].v[j]*v.v[j]; } return r;};
Объявление функций-друзей friend можно поместить и в закрытой и в открытой части объявления класса – не имеет значения, где именно. Фн-друзья явно указываются в объявлении класса, друзьями которого они являются. Функция-член одного класса может быть другом другого класса. Например: class List_iterator {//…;int*next();}; class List{friend int*List_iterator::next(););Встречаются случаи, когда все функции одного класса являются друзьями другого. class List {friend class List_iterator;} Это объявление делает все фн-члены класса List_iterator фукциями-друзьями класса List. Ясно, что классы-друзья должны использоваться только для отражения тесно связанных концепций.