Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемwww.rema44.ru
1 Объектно-ориентированное программирование С++. Лекция 9 Карпов В.Э.
2 ООП C++2 "Попинаем" C++ Диссертация Б. Страуструпа, программа на яз. Симула. Программа была написана очень быстро и легко. Скорость работы этой программы крайне мала (говорят, ее не хватало даже для того, чтобы насчитать необходимые данные к моменту защиты диссертации). => Желание создать свой язык, который бы совмещал в себе высокую скорость разработки (от Симулы) и высокую скорость выполнения (от С). Желание создать свой язык, который бы совмещал в себе высокую скорость разработки (от Симулы) и высокую скорость выполнения (от С).">
3 ООП C++3 Цели нового языка Язык должен быть объектно-ориентированным. Язык должен быть эффективным. Язык должен быть таким, чтобы программисты на С могли легко на него перейти. Компилятор должен находить все возможные ошибки Технология создания первого компилятора C++: На языке C был написан препроцессор, преобразующий подмножество нового языка в обычный язык C. На подмножестве C++ и был разработан первый транслятор с C++ и затем «раскручен» в C-код, пригодный к компиляции в исполняемую программу. Целевой машиной для первого C++ транслятора была любая машина, способная выполнять C-программу (результатом трансляции был C-код).
4 ООП C++4 Претензии к C++ "C++ мутирует чуть ли не каждый квартал, постепенно превращаясь в игрушку-трансформер, а сам автор C++ вынужден выпускать одну книжку за другой для толкования своего детища." "С внедрением языка C++ в коммерческую разработку резко упала надежность программного обеспечения." "Чрезмерная избыточность языка C++ привела к тому, что один и тот же алгоритм каждый программист кодирует по-своему и не самым оптимальным способом." "C++ - просто бескрайнее море перегруженных операторов."
5 ООП C++5 Объекты "C++ - не "настоящий" объектный язык" Безуспешные попытки построения единой иерархии классов с общим базовым классом Object (идея Smalltalk). В C++ тщательно продуманные иерархии библиотек классов оказывались негибкими, а работа классов неочевидной. Для того чтобы библиотеками классов можно было пользоваться, их приходилось поставлять в исходных текстах.
6 ООП C++6 Шаблоны и объем кода Появление шаблонных классов поставило крест на этом направлении развития: Наследованием стали пользоваться только в тех случаях, когда требовалось порождение специализированной версии имеющегося класса. Библиотеки стали составляться из отдельных классов и небольших несвязанных друг с другом иерархий. => Стало снижаться повторное использование кода, т.к. в C++ невозможно полиморфное использование классов из независимых иерархий. Повсеместное применение шаблонов ведет к недопустимому росту объема скомпилированного кода (шаблоны реализуются методами макрогенерации).
7 ООП C++7 Проблемы двоичной совместимости Один из тяжелейших недостатков C++, унаследованный им от синтаксиса С, состоит в доступности компилятору описания внутренней структуры всех использованных классов. => Изменение внутренней структуры представления какого-нибудь библиотечного класса приводит к необходимости перекомпиляции всех программ, где эта библиотека используется. => Это сильно ограничивает разработчиков библиотек в части их модернизации (выпуская новую версию, они должны сохранять двоичную совместимость с предыдущей). => C++ "в чистом виде" не пригоден для ведения больших проектов.
8 ООП C++8 C++ по-прежнему ненадежен 1.void main(void) 2.{ 3. int len = 10; 4. char *pSource = "abcd"; 5. char c; 6. int n = 10; 7. switch (len % 8) 8. { 9. case 0: 10. { 11. do 12. { 13. c = *pSource++; 14. case 7: c = *pSource++; 15. case 1: c = *pSource++; 16. } 17. while (--n > 0); 18. } 19. } 20.} 0); 18. } 19. } 20.}">
9 ООП C++9 Непредсказуемость кода Проблема "скрытого кода" void f (const std::string& s); При вызове f ("Hello, world!") будет создан объект класса std::string, он передается функции, а потом уничтожается. Т.е. вполне корректный и правильный код несет в себе скрытые затраты на создание и уничтожение объекта. Старые "претензии" к ссылкам:. void func1 (A& a); void func2 (A a);
10 ООП C++10 Библиотека STL Standard Template Library (STL, Степанов) - надстройка над C++. Задачи: Упростить работу с C++ Сделать ее комфортной.
11 ООП C++11 Возможности STL классы string и wstring реализующих динамические строки (с однобайтовыми и двубайтовыми символами); класс complex реализующий комплексные числа; классы по локализации приложений; потоки ввода/вывода для файлов, консоли и строк; классы обработки исключений; итераторы - сходные по функциональности с указателями объекты, используемые для обработки элементов контейнерных типов; контейнерные классы - классы по управлению множеством элементов одного типа, как –vector - динамический массив; –list - список; –queue,deque - очередь; –stack - стек; –map, multimap - отображения (ассоциативные массивы); –set - множество; алгоритмы - шаблоны функций для обработки элементов массивов и контейнерных классов; различные вспомогательные классы –функциональные объекты - классы для которых перегружена операция (), используется в алгоритмах; –pair - класс реализующий пару значений, используемый с отображениями; –auto_ptr - простой "умный" указатель.
12 ООП C++12 Исключения Механизм исключений позволяет легко отследить различные ошибки в программе. Операторы: try - определяет блок, в котором необходимо отследить исключения. throw - вызывает исключение указанного типа. catch() - определяет блок обработки исключения указанного типа. Подобных блоков может быть несколько для каждого типа. Если же тип исключения не важен или нужно обработать исключения по умолчанию, то в качестве аргумента используется троеточие.
13 ООП C++13 Пример 1.#include 2.using namespace std; 3.float divfunc(float a, float b) 4.{ 5. if(b==0) throw 1; 6. return a/b; 7.} 8.void main(void) 9.{ 10. float a,b,c; 11. couta>>b; 13. try 14. { 15. c=divfunc(a,b); 16. // если b==0, то следующая строка не выполнится 17. cout
14 ООП C++14 Атрибут throw В некоторых компиляторах можно явно указать, что функция или метод могут вызвать исключение (другие компиляторы могут просто игнорировать такую конструкцию, не сообщая об ошибке синтаксиса). void func1(int a) throw(...) {} void func1(int a) throw() {} void func3(int a) throw(int) { if(a>5) throw 2; }
15 ООП C++15 STL исключения В STL определено несколько классов исключений. Например, в файле stdexcept объявлены стандартные исключения: invalid_argument - вызывается при передаче неправильного аргумента; length_error - вызывается при превышении размера данных; out_of_range - вызывается при выходе за допустимые границы; overflow_error - вызывается при переполнении. Эти и другие классы являются потомками класса exception. Через виртуальный метод what можно получить дополнительную информацию об исключении. class logic_error: public exception { public: logic_error (const string& what_arg): str_(what_arg) { ; } virtual ~logic_error (); virtual const char * what () { return str_.data(); } private: string str_; }; class invalid_argument: public logic_error { public: invalid_argument (const string& what_arg): logic_error(what_arg) {;} virtual ~invalid_argument (); };
16 ООП C++16 Пример 1.#include 2.#include 3.using namespace std; 4.class Range 5.{ 6. int r1,r2,pos; 7. public: 8. Range(int rr1,int rr2, int ppos) { r1=rr1; r2=rr2; pos=ppos; } 9. void setPos(int ppos) 10. { 11. if(ppos r2) 12. throw std::invalid_argument("setPos illegal argument"); 13. pos=ppos; 14. } 15.}; 16.void main(void) 17.{ 18. Range r(10,20,12); 19. try 20. { 21. r.setPos(25); 22. } 23. catch(exception &e) { cout
17 ООП C++17 Класс auto_ptr Класс auto_ptr (простой "умный" указатель) имеет следующие ограничения: объектом может владеть только один указатель, объектом не может быть массив, нельзя использовать адресную арифметику. Единственное назначение этого класса - автоматизировать уничтожение выделенной ранее памяти. Данный класс используется, когда время существование выделенного объекта можно ограничить определенным блоком. Делая код более безопасным, данные классы не наносят ущерб размеру или скорости программы.
18 ООП C++18 Пример 1.#include // объявление шаблона класса auto_ptr 2.#include 3.using namespace std; 4.// Внутри функции мы выделяем память для объекта типа int 5.// но не освобождаем ее явно оператором delete. 6.// Это делается автоматически. 7.void main(void) 8.{ 9. auto_ptr aptr(new int(20)); 10. auto_ptr aptr2; 11. cout
19 ООП C++19 Итераторы библиотеки STL Итераторы - удобная обертка для указателей, а выполнены они как шаблоны классов. "Обычный" указатель тоже можно считать итератором (очень примитивным). Удобства итераторов: автоматическое отслеживание размера типа, на который указывает итератор, автоматизированные операции инкремента и декремента для перехода от элемента к элементу и т.д. 2 важных правила работы с итераторами: получения итераторов и отслеживания значения "за пределом". –Метод begin() - возвращает итератор, указывающий на первый элемент данных –Метод end() - возврат значения "за пределом" (past-the-end). Итераторы: основные и вспомогательные.
20 ООП C++20 Фрагменты определений 1.template class _Vector_base { 2.public: _Vector_base(const _Alloc& __a) 5. : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) { } 6. _Vector_base(size_t __n, const _Alloc& __a) 7. : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) 8. { 9. _M_start = _M_end_of_storage.allocate(__n); 10. _M_finish = _M_start; 11. _M_end_of_storage._M_data = _M_start + __n; 12. } 13. ~_Vector_base() {... } 14.protected: 15. _Tp* _M_start; 16. _Tp* _M_finish; }; 19.template class vector : public _Vector_base { typedef _Vector_base _Base; public: 24. iterator begin() { return this->_M_start; } 25. iterator end() { return this->_M_finish; } }
21 ООП C++21 Итераторы ввода Наиболее простые из всех итераторов STL, и доступны они только для чтения. Оператор разыменовывания (*) для прочтения содержимого объекта, на который итератор указывает. Оператор (++) - перемещение от первого элемента, на который указывает итератор ввода, к следующему. Итераторы ввода возвращает только шаблонный класс istream_iterator.
22 ООП C++22 Алгоритм for_each template Function for_each (InputIterator first, InputIterator last, Function f) { while (first != last) f(*first++); return f; } Или так: template Function for_each(InputIter first, InputIter last, Function f) { for ( ; first != last; ++first) f(*first); return f; } 1.#include 2.#include 3.using namespace std; 4.void printValue(int num) { cout
23 ООП C++23 Итераторы вывода #include using namespace std; main(void) { int init1[] = {1, 2, 3, 4, 5}; int init2[] = {6, 7, 8, 9, 10}; vector v(10); merge(init1, init1 + 5, init2, init2 + 5, v.begin()); copy(v.begin(), v.end(), ostream_iterator (cout, "\n")); }
24 ООП C++24 Однонаправленные итераторы Если соединить итераторы ввода и вывода, то получится однонаправленный итератор (forward iterator), который может перемещаться по цепочке объектов в одном направлении. Для такого перемещения в итераторе определена операция инкремента (++). template void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value) { while (first != last) { if (*first == old_value) *first = new_value; ++first; }} template void replace(ForwardIter first, ForwardIter last, const Tp& old_value, const Tp& new_value) { for ( ; first != last; ++first) if (*first == old_value) *first = new_value; }
25 ООП C++25 Пример 1.#include 2.#include 3.#include 4.#include 5.using namespace std; 6.main(void) 7.{ 8. int init[] = {1, 2, 3, 4, 5}; 9. replace(init, init + 5, 0, 2); 10. replace(init, init + 5, 1, 0); 11. replace(init, init + 5, 2, 1); 12. copy(init, init + 5, ostream_iterator (cout, "\n")); 13.}
26 ООП C++26 Двунаправленные итераторы 1.#include 2.#include 3.#include 4.#include 5.using namespace std; 6.main(void) 7.{ 8. int init[] = {1, 2, 3, 4, 5}; 9. reverse(init, init + 5); 10. copy(init, init + 5, ostream_iterator (cout, "\n")); 11.}
27 ООП C++27 Итераторы произвольного доступа 1.#include 2.#include 3.#include 4.using namespace std; 5.void main(void) 6.{ 7. const int init[] = {1, 2, 3, 4, 5}; 8. vector v(5); 9. typedef vector ::iterator vectItr; 10. vectItr itr; 11. copy(init, init + 5, itr = v.begin()); 12. cout
28 ООП C++28 Итераторы потоков 1.#include 2.#include 3.#include 4.#include 5.using namespace std; 6.main(void) 7.{ 8. istream_iterator is(cin); 9. ostream_iterator os(cout, " - last entered value\n"); 10. int input; 11. while((input = *is) != 666) 12. { 13. *os++ = input; 14. is++ ; 15. } 16.}
29 ООП C++29 Итераторы вставки 1.#include 2.#include 3.#include 4.using namespace std; 5.main(void) 6.{ int init[] = {0, 0}; int init1[] = {3, 2, 1}; 7. int init2[] = {1, 2, 3}; int init3[] = {1, 1, 1}; 8. list l(2); 9. copy(init, init + 2, l.begin()); 10. copy(l.begin(), l.end(), ostream_iterator (cout, " ")); 11. cout
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.