Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций ООПро.doc
Скачиваний:
43
Добавлен:
13.04.2015
Размер:
431.62 Кб
Скачать

Стандартная библиотека

Ни одна программа приличных размеров не пишется с использованием только «голых» конструкций языка. Обычно используются различные готовые библиотеки, в которых другие программисты уже написали код, облегчающий работу в данной предметной области. Существуют различные библиотеки для различных целей. Например, библиотека 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++.

Она предоставляет набор средств, которые можно классифицировать следующим образом:

  1. Строки и потоки ввода-вывода;

  2. Контейнеры (такие как vector,list иmap) и алгоритмы, их использующие (сортировка, слияние, поиск и др.)

  3. Поддержка численных расчетов (комплексные числа, вектора с арифметическими операциями и др.)

  4. Стандартная библиотека C(поддержка операций с плавающей точкой, работа сC-строками и др.)

  5. Поддержка средств языка времени выполнения (определение типа во время выполнения и др.)

Стандартная библиотека определена в пространстве имен 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(Адаптер) Преобразование стандартного интерфейса класса в интерфейс, более подходящий для нужд клиента

  • Итератор