![](/user_photo/2706_HbeT2.jpg)
- •Содержание
- •ВВЕДЕНИЕ
- •1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД
- •2. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
- •2.1. Абстрактные типы данных
- •2.2. Базовые принципы объектно-ориентированного программирования
- •2.3. Основные достоинства языка С++
- •2.4. Особенности языка С++
- •2.4.1. Ключевые слова
- •2.4.2. Константы и переменные
- •2.4.3. Операции
- •2.4.4. Типы данных
- •2.4.5. Передача аргументов функции по умолчанию
- •2.5.1. Объект cin
- •2.5.2. Объект cout
- •2.5.3. Манипуляторы
- •3.1. Объекты
- •3.2. Понятие класса
- •3.3. Конструктор копирования
- •3.4. Конструктор explicit
- •3.5. Указатель this
- •3.6. Встроенные функции (спецификатор inline)
- •3.7. Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •3.8. Вложенные классы
- •3.9. Static-члены (данные) класса
- •3.10. Компоненты-функции static и const
- •3.11. Proxi-классы
- •3.12. Ссылки
- •3.12.1. Параметры ссылки
- •3.12.2. Независимые ссылки
- •3.13. Пространства имен
- •3.13.3. Ключевое слово using как объявление
- •3.13.4. Псевдоним пространства имен
- •3.14. Практические приемы ограничения числа объектов класса
- •4. НАСЛЕДОВАНИЕ
- •4.1.1. Конструкторы и деструкторы при наследовании
- •4.2. Виртуальные функции
- •4.3. Абстрактные классы
- •4.4. Виртуальные деструкторы
- •4.6. Виртуальное наследование
- •5.2. Перегрузка операторов
- •5.2.2. Перегрузка унарного оператора
- •5.2.3. Дружественная функция operator
- •5.2.4. Особенности перегрузки операции =
- •5.2.5. Перегрузка оператора []
- •5.2.6. Перегрузка оператора ()
- •5.2.7. Перегрузка оператора ->
- •5.2.8. Перегрузка операторов new и delete
- •5.3. Преобразование типа
- •5.3.1. Явные преобразования типов
- •6. ШАБЛОНЫ
- •6.1. Параметризированные классы
- •6.2. Передача в шаблон класса дополнительных параметров
- •6.3. Шаблоны функций
- •6.4. Совместное использование шаблонов и наследования
- •6.5. Шаблоны класса и friend-функции
- •6.6. Некоторые примеры использования шаблона класса
- •6.6.1. Реализация smart-указателя
- •6.6.2. Задание значений параметров класса по умолчанию
- •7.2. Состояние потока
- •7.3. Строковые потоки
- •7.4. Организация работы с файлами
- •7.5. Организация файла последовательного доступа
- •7.6. Создание файла произвольного доступа
- •7.7. Основные функции классов ios, istream, ostream
- •8. ИСКЛЮЧЕНИЯ В С++
- •8.2. Перенаправление исключительных ситуаций
- •8.3. Исключительная ситуация, генерируемая оператором new
- •8.6. Спецификации исключительных ситуаций
- •8.7. Задание собственного неожиданного обработчика
- •9. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ (STL)
- •9.3. Категории итераторов
- •9.4. Операции с итераторами
- •9.5. Контейнеры последовательностей
- •9.5.2. Контейнер последовательностей list
- •9.5.3. Контейнер последовательностей deque
- •9.6. Ассоциативные контейнеры
- •9.6.1. Ассоциативный контейнер multiset
- •9.6.2. Ассоциативный контейнер set
- •9.6.3. Ассоциативный контейнер multimap
- •9.7.1. Адаптер stack
- •9.7.2. Адаптер queue
- •9.7.3. Адаптер priority_queue
- •9.8. Алгоритмы
- •9.8.1. Алгоритмы сортировки sort, partial_sort, sort_heap
- •9.8.2. Алгоритмы поиска find, find_if, find_end, binary_search
- •9.8.3. Алгоритмы fill, fill_n, generate и generate_n
- •9.8.4. Алгоритмы equal, mismatch и lexicographical_compare
- •9.8.6. Алгоритмы работы с множествами
- •9.8.7. Алгоритмы swap, iter_swap и swap_ranges
- •9.8.8. Алгоритмы copy, copy_backward, merge, unique и reverse
- •10. ПРИМЕРЫ РЕАЛИЗАЦИИ КОНТЕЙНЕРНЫХ КЛАССОВ
- •10.1. Связанные списки
- •10.1.1. Реализация односвязного списка
- •10.2. Реализация бинарного дерева
- •11. ПРОГРАММИРОВАНИЕ ДЛЯ WINDOWS
- •11.1. Система, управляемая сообщениями
- •11.2. Управление графическим выводом
- •11.3. Контекст устройства
- •11.3.1. Экран
- •11.3.2. Принтер
- •11.3.3. Объект в памяти
- •11.3.4. Информационный контекст
- •11.4. Архитектура, управляемая событиями
- •11.5. Исходный текст программы
- •11.7. Некоторые новые типы данных
- •11.8. Венгерская нотация
- •11.9. Точка входа программы
- •11.11. Создание окна
- •11.12. Цикл обработки сообщений
- •11.13. Оконная процедура
- •11.14. Обработка сообщений
- •11.15. Обработка сообщений функцией DefWindowProc
- •11.16. Синхронные и асинхронные сообщения
- •11.17. Еще один метод получения описателя контекста устройства
- •11.19. Полосы прокрутки
- •Литература
cout << "\n адрес переменных i = "<<&i<<" |
j = "<<&j; |
|
||||
cout << "\n значение |
i = "<<i<<" j = "<<j; |
|
|
|||
j=5; |
|
// |
|
|
|
|
cout << "\n адрес переменных i = "<<&i<<" |
j = "<<&j; |
|
||||
cout << "\n значение |
i = "<<i<<" j = "<<j; |
|
|
|||
return 0; |
|
|
|
|
|
|
} |
|
|
|
|
|
|
В результате работы программы будет получено: |
|
|||||
адрес переменных i = 0xадрес1 |
j = 0xадрес2 |
|
|
|||
значение |
i = 1 |
j = 1 |
|
|
|
|
адрес переменных i = 0xадрес1 |
j = 0xадрес2 |
|
|
|||
значение |
i =5 |
j = 5 |
|
|
|
|
В этом случае компилятор создает временный объект j, которомуРпри- |
||||||
|
|
|
|
|
У |
|
сваивается адрес ранее созданного объекта i. Далее j может быть использовано |
||||||
как второе имя i. |
|
|
|
|
Г |
И |
|
|
|
|
|
3.13. Пространства имен
При совпадении имен разных элементов в одной области действия часто
|
|
|
а |
возникает конфликт имен. Наиболее часто это возникает при использовании |
|||
различных пакетов библиотек, содержащих, н примерБ, одноименные классы. |
|||
|
|
к |
|
Пространства имен используются для разделения глобального пространства |
|||
имен, что позволяет уменьшить колич |
ес |
|
|
тво онфликтов. |
|||
т |
|
|
|
3.13.1. Определение пространс |
ва им н |
Синтаксис пространства имен неко орым образом напоминает синтаксис структур и классов. После ключевого слова namespace следует необязательное
имя пространства имен, затем писывае ся пространство имен, заключенное в |
||||
фигурные скобки. |
|
и |
||
л |
о |
|||
namespace NAME |
||||
{ int a; |
б |
|
|
|
doudle b; |
|
|
|
|
и |
|
|
|
|
char *fun(char *,int); |
||||
class CLS |
|
|
|
|
Б |
|
|
|
|
{ . . . |
|
|
|
public:
. . .
}
}
Далее, если обращение к элементам пространства имен производится вне контекста, его имя должно быть полностью квалифицировано, используя ::
NAME::b=2;
NAME:: fun(str,NAME:: a);
Внутри пространства имен можно поместить группу объявлений классов,
58
типов и функций. Реализация функций пространства имен должна находиться вне самого пространства имен. Это позволит не только отделить реализацию функций от их объявления, но и избежать загромождения пространства имен. По существу, namespace определяет область видимости.
Использование безымянного пространства имен (отсутствует имя про- странства имен) позволяет определить уникальность объявленных в нем иден- тификаторов с областью видимости в пределах файла.
Контексты пространства имен могут быть вложены.
namespace NAME1 |
|
|
{ int a; |
|
|
namespace NAME2 |
|
И |
} |
|
|
{ int a; |
|
|
int fun1(){return NAME1:: a}; // возвращается значениеРпервого a |
||
int fun2(){return a}; |
|
У |
|
// возвращается значение второго a |
|
} |
|
|
NAME1::NAME2::fun1(); |
// вызов функции |
|
Если в каком-то месте программы интенсивноГиспользуется некоторый |
||
|
|
а |
контекст и все имена уникальны по отношению к нему, то можно сократить |
||
полные имена, объявив контекст текущим сБпомощью оператора using. |
||
|
ак |
|
Если элементы пространства имен будут интенсивно использоваться, то |
||
ое |
|
|
можно использовать ключев |
слово using для упрощения доступа к ним. Клю- |
|
чевое слово using использу тся и |
директива, и для объявления. Синтаксис |
|
слова using определяет, являе ся ли оно директивой или объявлением. |
||
3.13.2. Ключев е сл во using как директива |
||
и |
|
|
Инструкц я usingтnamespace имя позволяет предоставить все имена, |
||
объявленные в пространствео |
имен, |
для доступа в текущей области действия. |
Эта инструкц я называется директивой using. Это позволит обращаться к этим
именам |
ез указания их полного имени, включающего название пространства |
имен. |
л |
#include <iostream> |
|
б |
|
using namespace std; |
|
Биnamespace NAME |
{int n1=1; int n2=2;
}
// int n1; приводит к неоднозначности в main для переменной n1
int main() |
|
{ NAME::n1=3; |
|
// n1=3; |
// error 'n1' : undeclared identifier |
59
|
// n2=4; |
// error 'n2' : undeclared identifier |
|
|
|
|
using namespace NAME; |
// далее n1 и n2 доступны |
|
||
|
n2=4; |
|
|
|
|
|
cout << n1 <<" "<< n2 << endl; |
// результат 3 |
4 |
|
|
|
{ n1=5; |
|
|
|
|
|
n2=6; |
|
|
|
|
|
cout << n1 <<" "<< n2 << endl; // результат |
5 6 |
|
||
|
} |
|
|
|
|
|
return 0; |
|
|
|
Р |
} |
|
|
|
|
|
В результате выполнения программы получим: |
|
||||
3 |
4 |
|
|
|
|
5 |
6 |
|
|
|
|
|
|
|
И |
||
Область действия директивы using распространяется на блок, в котором |
|||||
она использована, и на все вложенные блоки. |
Г |
|
|||
|
|
|
Б |
|
|
Если одно из имен относится к глобальной области, аУдругое объявлено |
внутри пространства имен, то возникает неоднозначность. Это проявится только |
|
при использовании этого имени, а не при объявлении. |
|
#include <iostream> |
а |
using namespace std; |
к |
В данном фрагменте стандартный заголовочный файл библиотеки вво- да/вывода iostream не имеет расшир ниясе. В содержимое этого файла опреде-
ляется как часть namespace std.
ность. Основная проблема, к руютпризвана решить такая конструкция это не-
Для достижения переносимос и р комендуется использовать директиву
using, хотя и существуют компиля оры, не поддерживающие данную возмож-
поддерживают вариантцияс подключением файлов стандартной библиотеки с рас-
зависимость от ограничен на длину имени файла в различных операционных системах. Более тогол, комп ляторы Microsoft последних версий вообще не
ширением .h, тб.е. конструк #include <iostream.h> в Visual C++ 7.1 не компи-
лируется.
Б3.13.3.иКлючевое слово using как объявление
Объявлен е using имя::член подобно директиве, при этом оно обеспечи- вает более подробный уровень управления. Обычно using используется для объ- явления некоторого имени (из пространства имен) как принадлежащего теку- щей области действия (блоку).
#include <iostream> using namespace std; namespace NAME
{int n1=1; int n2=2;
60