
- •Конспект лекций по курсу «Объектно-ориентированное программирование»
- •1. Введение
- •Эффективные типы, определяемые пользователем
- •Копирование объектов класса
- •Перегрузка операторов
- •Дружественные функции
- •Наследование
- •Виртуальные функции
- •Абстрактные классы
- •Включение
- •Шаблоны
- •Стандартная библиотека
Стандартная библиотека
Ни одна программа приличных размеров не пишется с использованием только «голых» конструкций языка. Обычно используются различные готовые библиотеки, в которых другие программисты уже написали код, облегчающий работу в данной предметной области. Существуют различные библиотеки для различных целей. Например, библиотека MFCиспользуется для облегчения программирования дляWin32 по сравнению с «чистым» программированием подWin32API.Win32APIпредполагает процедурный интерфейс кWindows, аMFC– объектно-ориентированный. КомпанияBorlandпредоставляет для тех же целей библиотекуOWL.
CRun-TimeLibrary– предоставляет функции и макросы для многих аспектов программирования. Эта бибилиотека разрабатывалась достаточно давно, поэтому она ориентирована на использование в программах на языкеC(как видно из ее названия). Так какC++ совместим сC, тоCRun-TimeLibraryможно использовать и вC++-программах. Функции этой бибилиотеки (в том виде, в котором она существует вMicrosoftVisualС++) разбиты на 19 категорий, среди которых:
поддержка функций с переменной длиной списка аргументов;
выделение памяти (malloc,callocи др.);
контроль жизненным циклом процесса (exec,exit);
операции с памятью (memcpy, …);
классификация символов (isalpha);
преобразование данных (atoi, _itoa,tolower);
отладка (_ASSERT, _CrtCheckMemory);
операции с каталогами (_chdir);
операции с файлами (_filelength);
математические функции и поддержка операций с плавающей точкой (sin,cos,abs,floor,ldexp(mant,exponent));
ввод-вывод
потоковый ввод-вывод (getc,fwrite)
низкоуровневый ввод-вывод (_open, _write)
ввод-вывод с/на консоль и из/в порт (_cprintf, _inp)
время и дата в стиле C(clock,difftime) <time.h>
алгоритмы поиска и сортировки (bsearch,qsort)
обработка ошибок в стиле С <errno.h>
функции над строками в стиле C(strcmp,strcpy) <string.h>, <stdlib.h>
Часть из этих функций стандартизирована ANSIиPOSIX, часть – включена компаниейMicrosoft(все функции, начинающиеся с подчеркивания).
Существует также так называемая стандартная библиотека. Эта библиотека включена в стандарт C++.
Она предоставляет набор средств, которые можно классифицировать следующим образом:
Строки и потоки ввода-вывода;
Контейнеры (такие как vector,list иmap) и алгоритмы, их использующие (сортировка, слияние, поиск и др.)
Поддержка численных расчетов (комплексные числа, вектора с арифметическими операциями и др.)
Стандартная библиотека C(поддержка операций с плавающей точкой, работа сC-строками и др.)
Поддержка средств языка времени выполнения (определение типа во время выполнения и др.)
Стандартная библиотека определена в пространстве имен std. Это сделано для того, чтобы избежать возможного конфликта между идентификаторами библиотеки и идентификаторами, определенными в программе. Поэтому нужно каждый идентификатор стандартной библиотеки предварять префиксомstd::, либо перед их использованием написатьusing namespace std; (в последнем случае теряется преимущество от определения библиотеки в отдельном пространстве имен).
Каждое средство стандартной библиотеки становится доступным через какой-либо стандартный заголовочный файл наподобие <iostream>. Например, чтобы использовать строки, нужно подключить <string>, а для использования списков – <list>. Полный список заголовочных файлов дан в[Страуструп].
Ввод-вывод
Требуемый заголовочный файл – <iostream>.
Стандартный поток вывода – cin, ввода – cout. Ввод-вывод определен для всех встроенных типов. При выводе в поток с помощью операторов << и >> осуществляется два действия: преобразование значений в последовательность символов, и вывод этой последовательности символов с помощью низкоуровневых операций вывода.
void f(){
cout<<10<<13.7<<”abcd”;
double d; int i;
cin>>d>>i;
}
Здесь последовательность символов: 1,0,1,3,.,7,a,b,c,d.
Операторы << можно ставить в цепочки благодаря тому, что результат каждой операции является потоком.
Ввод осуществляется оператором >>. Тип операнда в его правой части определяет способ интерпретации символов и то, куда будут записываться полученные значения. Стандартный поток ввода – cin.
Когда преобразование не желательно и мы хотим напрямую работать с последовательностями символов, мы используем функции неформатного ввода-вывода putиget.
cout.put('s');
char ch;
cin.get(ch);
Форматирование.
Часто необходимо управлять форматом вывода чисел (система счисления, точность чисел с плавающей точкой и др.)
cout<<123.4567;
cout.setf(ios_base::showpos);
cout<<123.4567<<setprecision(8)<<123.4567;
Строки
В ст. библ. имеется тип string, который дополняет строковые литералы, использовавшиеся ранее. Типstringобеспечивает множество полезных операций над строками, например, конкатенацию.
string s1="Hello",s2="world";
string s3=s1+", "+s2+’!’;
cout<<s3;
Сложение (+) строк означает конкатенацию. Можно складывать строку со строкой, строковым литералом и символом. Оператор += добавляет что-либо в конец строки:
s3+='\n';
Строки могут сравниваться друг с другом и со строковыми литералами:
if(s1==s2){ }
if(s3=="Привет, мир!"){ }
Другие операции:
string s4=s3.substr(0,4);//взятие подстроки
s4.insert(0,"Road to ");//вставка
s4.replace(s4.find("Hell"),4,"Heaven");//поиск и замена
TextOut(hdc,1,1,s4.c_str(),s4.size());//преобразование в C-строку и число символов строки
Того же эффекта можно добиться, используя C-строки, но это будет более громоздко. Кроме того строкиstringможно передавать в функции как аргументыпо значениюи возвращать из функциипо значению, предоставив системе заботиться о распределении памяти.
Контейнеры
Класс, главной целью которого является хранение объектов, называется контейнером. Реализация контейнеров, подходящих для данной задачи, и поддержка их нужными операциями – важнейшие шаги при написании любой программы.
Вектор
Существуют
string
vector
list
ostream, istream, ofstream, ifstream, ostringstream.
Проектирование программ
Понятия – объекты – сообщения – атрибуты – классы – методы – общность (наследование).
Литература: [1]
Правила и рекомендации по написанию хороших программ применительно к конкретному языку.
Пример. Несколько рекомендаций для C++ из [5]:
Везде, где только можно, используйте const.
Для классов с динамическим выделением памяти объявляйте копирующий конструктор и оператор присваивания.
Откладывайте определение переменных до последнего момента.
Тщательно обдумывайте использование встраиваемых функций.
Уменьшайте зависимости файлов при компиляции.
Предпочитайте ошибки во время компиляции ошибкам во время выполнения.
В [5]приводятся обоснования, примеры использования и выгоды от пименения этих правил.
Паттерны проектирования. (DesignPatterns) Литература: [6]
Другой перевод – шаблоны проектирования (не путать с template).
Под паттернами проектирования понимается описание взаимодействия объектов и классов, адаптированных для решения общей задачи в конкретном контексте.
Пример. Концепция Document-ViewвMFC.
Documentхранит представление, аView(Вид) определяет отображение документа на экране. Между документом и его видом вMFCустановлен протокол взаимодействия «подписка/оповещение». Вид должен гарантировать, что внешнее представление отражает состояние документа. При каждом изменении внутренних данных документ оповещает все зависящие от него виды, в результате чего вид обновляет себя. Такой подход позволяет присоединить к одному документу несколько видов, обеспечив тем самым различные представления. Можно создать новый вид, не переписывая документ.
<Рисунок с док. и 3 видами: табл, гистограмма, круговая диаграмма >
Несколько паттернов из [6].
Façade(Фасад) Предоставление единого интерфейса для набора различных интерфейсов в системе.
Adapter(Адаптер) Преобразование стандартного интерфейса класса в интерфейс, более подходящий для нужд клиента
Итератор