1 / 43

C++

C++. Объектно-ориентированное программирование. Первая программа C++. # include < iostream . h > int n = 5; // глобальная переменная void main () { int n ; // локальная переменная cout << " Enter n " ; // вывод в поток cin >> n ; // ввод из потока

ziazan
Download Presentation

C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++ Объектно-ориентированное программирование

  2. Первая программа C++ #include <iostream.h> int n = 5; // глобальная переменная void main() {int n; // локальная переменная cout << "Enter n" ; // вывод в поток cin >> n; // ввод из потока cout << "n = " << n; // вывод переменной в поток cout << "global n = " << ::n; // вывод глобальной переменной }

  3. Объектвектор #include <iostream.h> #include <alloc.h> class vector { private: float *p; // указатель на начало вектора int n; // количество элементов в векторе public: vector(int i = 3); // конструктор (назначен параметр по умолчанию) ~vector(); // деструтор (не может иметь параметров) float item(int i); // возвращает указанный элемент void assign(int i, float x); // назначениеэлемента float num() { return n; }; // возвращаетчислоэлементов (inline) float norm(); // возвращает квадрат нормы вектора };

  4. Объектвектор – реализация методов vector::vector(int i) { int j; n=i; p=new float[n]; for (j=0; j<n; j++) *(p+j)=0; cout << "vector created " << n << "\n"; } vector::~vector() { delete p; cout << "vector destroyed\n"; } float vector::item(int i) { if ((i>=0) && (i<n)) return *(p+i); else {cout << "Error in vector::item"; return 0;} }

  5. Объектвектор – реализация методов void vector::assign(int i, float x) { if ((i>=0) && (i<n)) *(p+i)=x; else cout << "Error in vector::assign"; } float vector::norm() { int i; float x=0; for (i=0; i<n; i++) x+=p[i]*p[i]; return x; }

  6. Использование объекта main() { int i; vector a(100); vector b; for (i=0; i<a.num(); i++) a.assign(i,i); cout << a.norm() << "\n"; a.~vector(); } vector created 100 vector created 3 328350 vector destroyed 100 vector destroyed 3

  7. Перегрузка операций { ... float operator()(int i); // возвращает указанный элемент void operator=(vector &x); // присваивает значение одного ... // векторадругому } float vector::operator()(int i) { if ((i>=0) && (i<n)) return *(p+i); else {cout << "Error in vector::item"; return 0;} } void vector::operator=(vector &x) { if (x.num()==n) for (int i=0; i<n; i++) p[i]=x(i); else cout << "Error in operator =\n"; } // в main(): c=a; cout << c(10) << "\n";

  8. Наследование class matrix: public vector {protected: int M,N; int lineaddres(int i, int j) { return i*N+j; }; public: matrix(int m=2, int n=2): vector(m*n) { M=m; N=n; } float item(int i,int j); void assign(int i,int j, float x); int m() { return M;}; int n() { return M;}; }; float matrix::item(int i, int j) { return vector::operator()(lineaddres(i,j)); } void matrix::assign(int i, int j, float x) { vector::assign(lineaddres(i,j),x); }

  9. Наследование 11 12 13 21 22 23 31 32 33 main() { int i,j; for (i=0; i<z.m(); i++) { for (j=0; j<z.n(); j++) { z.assign(i,j,(i+1)*10+j+1); cout << z.item(i,j) << " "; } cout << "\n"; } }

  10. Атрибуты наследования • private – доступны только в данном классе • protected – доступны только в данном классе и потомках • private – доступны для всеобщего использования

  11. Реализация класса Vector class vector { … public: vector(int i = 3); // конструктор vector(float x, float y, float z); // второйконструктор vector & operator=(vector &x); // присваивает значение одного в. другому vector & operator*(float c); // умножение вектора на скаляр float operator*(vector &x); // умножение вектора на вектор float & operator[](int i); // возвращает ссылку на элемент }

  12. Реализация класса Vector vector::vector(float x, float y, float z) { n=3; p=new float[n]; vector::assign(0,x); vector::assign(1,y); vector::assign(2,z); cout << "3d vector created " << n << "\n"; } vector& vector::operator=(vector &x) { if (x.num()==n) for (int i=0; i<n; i++) p[i]=x(i); else cout << "Error in operator =\n"; return *this; }

  13. Реализация класса Vector vector & vector::operator*(float c) // умножение вектора на скаляр { for (int i=0; i<n; i++) p[i]*=c; return *this; } float vector::operator*(vector &x) // умножение вектора на вектор { float s=0.0; for (int i=0; i<n; i++) s+=operator()(i)*x(i); return s; } float & vector::operator[](int i) { if ((i>=0) && (i<n)) return p[i]; else {cout << "Error in vector::item"; return p[0];} }

  14. Использование класса Vector main() { … vector d(1,1,1); b=d*2.0; b[0]=3; for (i=0; i<b.num(); i++) cout << b(i) << " "; } 3 2 2

  15. Наследование и виртуальные правила Наследование и виртуальные правила // КлассТочка class point { private: int x,y; // координаты int c; // и цвет точки public: point(int u, int v, int w = WHITE); // инициализация ~point(); // уничтожение void show(); // высвечивание точки void hide(); // стирание точки void move(int u, int v); // перемещение точки void change(int w); // изменение цвета точки };

  16. Наследование и виртуальные правила // методыкласса point point::point(int u, int v, int w) { x=u; y=v; c=w; } point::~point() { hide(); } void point::show() { putpixel(x,y,c); } void point::hide() { putpixel(x,y,BLACK); } void point::move(int u, int v) { hide(); x=u; y=v; show(); } void point::change(int w) { hide(); c=w; show(); }

  17. Наследование и виртуальные правила // главная программа void main(void) { int gdriver = DETECT, gmode; // инициализацияграфики initgraph(&gdriver, &gmode, "C:/BC5/BGI"); point p(0,240); for (int i=0; i<640; i++) { p.move(i,240); delay(10); } p.~point(); getch(); closegraph(); }

  18. Наследование и виртуальные правила // КлассТочка class point { protected: int x,y; // координаты int c; // и цвет точки public: point(int u, int v, int w = WHITE); // инициализация virtual ~point(); // уничтожение virtual void show(); // высвечиваниеточки virtual void hide(); // стираниеточки void move(int u, int v); // перемещениеточки void change(int w); // изменениецветаточки int getx() { return x; }; int gety() { return y; }; int getc() { return c; }; };

  19. Наследование и виртуальные правила // методыкласса point point::point(int u, int v, int w) { x=u; y=v; c=w; } point::~point() { hide(); } void point::show() { putpixel(x,y,c); } void point::hide() { putpixel(x,y,BLACK); } void point::move(int u, int v) { hide(); x=u; y=v; show(); } void point::change(int w) { hide(); c=w; show(); }

  20. Наследование и виртуальные правила // КлассОкружность class circ: public point { protected: int r; // радиусокружности public: circ(int u, int v, int w = WHITE, int s = 10); void show(); void hide(); void size(int s); int getr() { return r; } }; // методыклассаОкружность circ::circ(int u, int v, int w, int s) : point(u,v,w) { r=s; } void circ::show() { setcolor(c); circle(x,y,r); } void circ::hide() { setcolor(BLACK); circle(x,y,r); } void circ::size(int s) { hide(); r=s; show(); }

  21. Наследование и виртуальные правила // КлассОкружность class circ: public point { protected: int r; // радиусокружности public: circ(int u, int v, int w = WHITE, int s = 10); void show(); void hide(); void size(int s); int getr() { return r; } }; // методыклассаОкружность circ::circ(int u, int v, int w, int s) : point(u,v,w) { r=s; } void circ::show() { setcolor(c); circle(x,y,r); } void circ::hide() { setcolor(BLACK); circle(x,y,r); } void circ::size(int s) { hide(); r=s; show(); }

  22. Наследование и виртуальные правила // КлассКвадрат class square: public circ {public: square(int u, int v, int w, int s) : circ(u,v,w,s) {}; void show(); void hide(); }; // методыклассаКвадрат void square::show() { setcolor(c); rectangle(x-r,y-r,x+r,y+r); } void square::hide() { setcolor(BLACK); rectangle(x-r,y-r,x+r,y+r); }

  23. Передача объектов как аргументов функции class obj { }

  24. Массивы указателей на объекты void main(void) { point *figures[3]; // массив указателей на родительский тип // инициализация разными конструкторами figures[0]=new point(320,240); figures[1]=new square(320,240,20,WHITE); figures[2]=new circ(320,240,30); // выполнение метода с одинаковым именем for (int i=0; i<3; i++) figures[i]->show(); }

  25. Дружественные функции, дружественные классы class line; // Опережающее определение class box { int color; public : friend int same_color(line l, box b); } class line { int color; public : friend int same_color(line l, box b); } // Описание дружественной функции int same_color(line l, box b) { return (l.color==b.color) }

  26. Дружественные функции-операции #include <iostream.h> // Перегрузка операций ввода/вывода class vector { float x,y,z; public: vector (float a, float b, float c) {x=a; y=b; z=c; } friend ostream & operator << (ostream & stream, vector obj); friend istream & operator >> (istream & stream, vector &obj); };

  27. Дружественные функции-операции // vector inserter ostream & operator << (ostream & stream, vector obj) { stream << "(" << obj.x << ","; stream << obj.y << ","; stream << obj.y << ")\n"; return stream; } // vector extractor istream & operator >> (istream & stream, vector & obj) { stream >> obj.x >> obj.y >> obj.z; return stream; } void main() { vector a(1.0,2.0,3.0); cout << a; cin >> a; cout << a; }

  28. Множественное наследование, чистые виртуальные функции class color {protected: int c; // цвет public: color (int z) { c=z; } // конструктор int getcolor() { return c; } }; classfigure {protected: int x,y; // координаты int r; // размер public: figure (int a, int b, int z) { x=a; y=b; r=z; }; ~figure() { hide(); }; int getsize() { return r; }; virtual void show() = 0; // абстрактнаяфункция virtual void hide() = 0; // абстрактнаяфункция void move(int u, int v); }; void figure::move(int u, int v){ hide(); x=u; y=v; show();}

  29. Множественное наследование, чистые виртуальные функции // множественноенаследование class circus : public color, public figure {public: circus(int x, int y, int r, int c): color(c), figure (x,y,r) {}; // наследование конструкторов void show(); void hide(); }; void circus::show() { setcolor(c); circle(x,y,r); } void circus::hide() { setcolor(BLACK); circle(x,y,r); } void main(void) { int gdriver = DETECT, gmode; initgraph(&gdriver, &gmode, "C:/BC5/BGI"); // figure f(320,240,10); // так нельзя! circus cr(320,240,10,YELLOW); cr.show(); getch(); closegraph(); }

  30. Статические члены класса class st { static int c; public: static int incr(void) { return c++; } st(void) {cin << incr(); } ~st(void) { c--; } } . . . . st::c=0; st::incr();

  31. Шаблоны template <class T> // Шаблоныфункций T sqr ( T x ) { return x*x ; } main() { int i = 3; float x = 3.1; cout << sqr(i) << “\n”; cout << sqr(x) << “\n”; }

  32. Шаблоны template <class T, int size> // Шаблоныклассов class vec { T *q; int n; public: vec (void); }; template <class T, int size> vec<T,size>::vec(void) { q = new T[size]; }; void main() { vec <double, 200> d; vec <int, 100> k; }

  33. Обработка исключений Обработка исключений в стиле С++ • try (пытаться) - начало блока исключений; • catch (поймать) - начало блока, "ловящего" исключение; • Finally (завершение) – всегда выполняется последним • throw (бросить) - ключевое слово, "создающее" ("возбуждающее") исключение. Блок Try обработчика исключений Try...Catch...Finally содержит раздел кода, который будет отслеживать обработчик ошибок. Если во время выполнения какого-либо кода данного раздела возникает ошибка, Visual Basic проверяет каждый оператор Catch в пределах группы операторов Try...Catch...Finally, пока не обнаружит тот, условия которого совпадают с условиями ошибки. При обнаружении управление передается первой строке кода в этом блоке Catch. Если соответствующий оператор Catch не найден, поиск продолжается в операторах Catch внешнего блока Try...Catch...Finally, который содержит блок, в котором возникло исключение. Этот процесс продолжается по всему стеку, пока не будет обнаружен соответствующий блок Catch в текущей процедуре. Если он не найден, выдается ошибка. Код в разделе Finally всегда выполняется последним, непосредственно перед тем, как блок обработки ошибок выйдет из области видимости, независимо от того, выполнен ли код в блоках Catch. В разделе Finally следует поместить код очистки, чтобы закрыть файлы и освободить объекты.

  34. Обработка исключений void func() { try { throw 1; } catch(int a) { printf("Caught exception number: %d\n",a); return; } printf("No exception detected!\n"); return; } • Если выполнить этот фрагмент кода, то мы получим следующий результат: Caught exception number: 1 • Теперь закоментируйте строку throw 1;ифункция выдастNo exception detected!

  35. Обработка исключений catch может "ловить" данные любого типа, но вовсе не обязательно при это указывать переменную. Т.е. прекрасно будет работать что-нибудь типа этого: catch(dumbclass) { } так же, как и catch(dumbclass&) { } Так же можно "поймать" и все исключения: catch(...) { }

  36. Обработка исключений try { throw 1; // throw 'a'; } catch (long b) { cout << "пойман тип long: " << b << endl; } catch (char b) { cout << "пойман тип char: " << b << endl; }

  37. Обработка исключений try { Main.Setup(); Main.Loop(); Main.Close(); } catch (Exception &e) { // использование класса, ведущего лог. log("Exception thrown: %s", e.String()); // Показываем сообщение об ошибке и закрываем приложение. }

  38. Обработка исключений в стиле Microsoft #include <stdio.h> #include <excpt.h> main () // Таблица умножения {int i=9; int c; __try { i=i+1; i=i/(i-i); } __except(EXCEPTION_EXECUTE_HANDLER) { c=GetExceptionCode(); printf("Error - %d\n",c); } printf("%d\n",i); }

  39. Обработка исключений в стиле Microsoft set_terminate( term_func );

  40. Препроцессор языка С #define MAX 100 #define NAME “Borland C++” #define MIN(a,b) ( (a)<(b)) ? (a) : (b) printf(“Минимумиз x и y %d, MIN(x,y)); #include <имя_файла> #include “имя_файла” #include имя_макроса

  41. Препроцессор языка С void main () { #if MAX>99 printf(“MAX>99\n”); #else printf(“MAX<99\n”); #endif return 0; }

  42. Препроцессор языка С #if defined(MAX) && defined(MIN) #ifdef MAX #ifndef MAX #if defined(MAX) … #elif defined (MIN) … #else … #endif

  43. Препроцессор языка С #pragma warn +xxx, -xxx, and .xxx #error Error N 3

More Related