
- •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. Узагальнені алгоритми та бібліотека стандартних шаблонів. Ітератори.
24. Область видимости.
Объявление вводит имя в область видимости. Это значит, что имя может использоваться только в определенной части текста программы. Для имени, объявленного в теле функции (наз локальным), область видимости начинается с места объявления имени и заканчивается в конце блока, в котором это имя объявлено. Блоком наз фрагмент текста, заключенный в фигурные скобки.
Имя наз глобальным, если оно объявлено вне любой функции, класса или пространства имен. Область видимости глобальных имен простирается от места их объявления до конца файла, содержащего объявление. Объявление имени в блоке может скрыть объявление этого имени в охватывающем блоке или глобальное имя. Т.е. имя м/б замещено внутри блока и будет ссылаться там на другую сущность. После выхода из блока имя восстанавливает свой прежний смысл.
К скрытому глобальному имени можно обратиться с помощью оператора разрешения области видимости ::. Например, ::х=2;. Не существует способа обращения к скрытой локальной переменной.
Область видимости имени начинается в точке объявления, точнее сразу после объявителя, но перед инициализатором. Поэтому допускается использование имени в качестве инициализирующего значения для самого себя (хоть это и неразумно): int x=x;
Считается, что имена аргументов функции объявлены в самом внешнем блоке функции, поэтому void f(int x){int x;} явл ошибкой, т.к. переменная х дважды определяется в пределах одной и той же области видимости.
Пример: { int i;…} for(int i=0; ;i<=8;i++) {}; i=0; Тут і для for и і=0 разные.
В некоторых случаях область видимости и простронство имен совпадают. Правило обл видимости: Каждой обл вид соответствует своя таблица символов. Таблицы символов: глобальная (в единственном экземпляре), класса (на каждый класс – одна), функции (по одной таблице на каждую функцию). Таблицы символов связаны друг с другом. Каждая таблица имеет указатель на родителя. В глобальной таблице этот указатель – NULL. Таблица сиволов класса показывает на свой непосредственный базовый класс. При множественном наследовании –несколько указателей на базовые. Таблица символов функции указывает на таблицу символов класса,к которому она принадлежит, или на глобальную таблицу, если функция не является членом класса.
Область видимости задается последовательностью таблиц символов от данного места программы и до глобальной таблицы. Например: class B {/*1*/} void f1(){/*2*/ class C1 {/*3*/ class c2: public B {/*4*/ friends void f2(){/*5*/} void f3(){/*6*/} }void f4() }/*7*/}}
1) В ,глоб 2)ff1,глоб 3)c1,глоб 4)c2,B,глоб 5)f2,глоб 6)f3c2,B,глоб 7)f4,c1,глоб
25. Пространства имен. Директива using.
Пространство имен явл отражением логического группирования. Т.е. если некот объявления можно объединить по какому-либо критерию, их можно поместить в одно и то же пространство имен для отражения этого факта.
Член протсранства имен можно объявить внутри определения пространства имен, а определить позднее, при пом след записи: имя_пр-ва_имен::имя_члена. Члены пространства имен объявляются след обр: namespace имя_пр-ва_имен {//объявления и определения}. Нельзя объявить новый член пространства имен вне его определения, используя явный квалификатор.
Пространство имен явл областью видимости. Обычные локальные и глобальные области видимости и классы явл пространствами имен.
Обычные правила областей видимости применимы и к пространствам. Поэтому, если имя предварительно объявлено в пространстве имен или в охватывающей области, дальше его можно использовать без проблем. Имя из другого пространства можно использовать при помощи явного указания этого пространства в качестве квалификатора.
namespase M1 {int i1;int f1();}; #include “M1.h” #include “M2.h” void f() {cout<<M1::i1;M2::f2(); unsing M2::f2(); f2(); unsing namespase M1; class C {public: void Me()}; void C::Me() {}.
Если имя используется часто вне пределов своего пространства имен, можно воспользоваться using-объявлением. Например: using D::d //использовать d из D. using вводит локальный синоним. Такие синонимы следует делать как можно более локальными во избежание конфликтов имен.
using-директива делает доступными имена из пространства имен почти точно так же, как если бы они были объявлены вне своих пространст. Например: using namespace D;.
В применении к классам. Обїявления гыштп позволяют программисту создавать набор перегруженных функций из базовых и производных классов. Функции, объявленные в производном классе, скрывают функции из базового класса, которые в противном случае были бы доступны. Виртуальные функции можно замещать как обычно. using-объявление в определении класса должно относиться к членам базового класса. using-объявления нельзя использовать для члена класса вне этого класса, его производных классов или их фн-членов. using-директиву нельзя поместить в определение класса, и она не может использоваться для класса. using-объявление не может использоваться для получения доступа к дополнительной информации. Оно просто явл механизмом предоставления более удобного доступа к информации, доступ к которой в принципе разрешен.
26. Потоки. Иерархия потоковых классов. Ввод/вывод потоковых классов, типы которых созданы пользователем.
Поток – это последовательность элементов данных, направленная от источника к потребителю.
Ввод – преобразование объектов некоторого типа в последовательность символов. Ввод – предоставление средств запроса на ввод символов, строки значений других встроенных типов и типов, определяемых пользователем.
Каждая программа на С++ может пользоваться стандартными потоками: ст вывод (сout), ст вывод (cin) и вывод ошибок (cerr). Кроме того, можно создавать свои собственные потоки. В этом случае нужно указать, к чему их следует прикрепить.
Иерархия классов стандартных потоков: ios_base ← ios<>←istream<>&ostream<>
istream←istringstream<>&ifstream<>&iostream<>; ostream←iostream<>&ofstream<>&ostringstream<>; iostream<>←fstream<>&stringstream<>;
Классы с суфиксом <>явл шаблонами.
Рассмотрим определяемый пользователем тип complex: class complex{ public: double real() const {return re;} double imag() const {return im;}//…}; ostream&operator<<(ostream&s,complex z){ return s<<’(‘<<z.real()<<’,’<<z.imag()<<’)’;} . После этого таким оператором << можно пользоваться точно также, как оператором << для встроенных типов. Например: int main(){ complex x(1,2); cout<<’x=’<<x<<’\n’;}.
Определение операций ввода/вывода для типа, определяемого пользователем, не требует изменений в объявлении класса ostream.