430 likes | 616 Vues
C++. Объектно-ориентированное программирование. Первая программа C++. # include < iostream . h > int n = 5; // глобальная переменная void main () { int n ; // локальная переменная cout << " Enter n " ; // вывод в поток cin >> n ; // ввод из потока
E N D
C++ Объектно-ориентированное программирование
Первая программа C++ #include <iostream.h> int n = 5; // глобальная переменная void main() {int n; // локальная переменная cout << "Enter n" ; // вывод в поток cin >> n; // ввод из потока cout << "n = " << n; // вывод переменной в поток cout << "global n = " << ::n; // вывод глобальной переменной }
Объектвектор #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(); // возвращает квадрат нормы вектора };
Объектвектор – реализация методов 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;} }
Объектвектор – реализация методов 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; }
Использование объекта 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
Перегрузка операций { ... 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";
Наследование 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); }
Наследование 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"; } }
Атрибуты наследования • private – доступны только в данном классе • protected – доступны только в данном классе и потомках • private – доступны для всеобщего использования
Реализация класса 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); // возвращает ссылку на элемент }
Реализация класса 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; }
Реализация класса 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];} }
Использование класса 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
Наследование и виртуальные правила Наследование и виртуальные правила // КлассТочка 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); // изменение цвета точки };
Наследование и виртуальные правила // методыкласса 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(); }
Наследование и виртуальные правила // главная программа 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(); }
Наследование и виртуальные правила // КлассТочка 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; }; };
Наследование и виртуальные правила // методыкласса 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(); }
Наследование и виртуальные правила // КлассОкружность 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(); }
Наследование и виртуальные правила // КлассОкружность 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(); }
Наследование и виртуальные правила // КлассКвадрат 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); }
Передача объектов как аргументов функции class obj { }
Массивы указателей на объекты 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(); }
Дружественные функции, дружественные классы 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) }
Дружественные функции-операции #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); };
Дружественные функции-операции // 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; }
Множественное наследование, чистые виртуальные функции 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();}
Множественное наследование, чистые виртуальные функции // множественноенаследование 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(); }
Статические члены класса class st { static int c; public: static int incr(void) { return c++; } st(void) {cin << incr(); } ~st(void) { c--; } } . . . . st::c=0; st::incr();
Шаблоны 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”; }
Шаблоны 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; }
Обработка исключений Обработка исключений в стиле С++ • try (пытаться) - начало блока исключений; • catch (поймать) - начало блока, "ловящего" исключение; • Finally (завершение) – всегда выполняется последним • throw (бросить) - ключевое слово, "создающее" ("возбуждающее") исключение. Блок Try обработчика исключений Try...Catch...Finally содержит раздел кода, который будет отслеживать обработчик ошибок. Если во время выполнения какого-либо кода данного раздела возникает ошибка, Visual Basic проверяет каждый оператор Catch в пределах группы операторов Try...Catch...Finally, пока не обнаружит тот, условия которого совпадают с условиями ошибки. При обнаружении управление передается первой строке кода в этом блоке Catch. Если соответствующий оператор Catch не найден, поиск продолжается в операторах Catch внешнего блока Try...Catch...Finally, который содержит блок, в котором возникло исключение. Этот процесс продолжается по всему стеку, пока не будет обнаружен соответствующий блок Catch в текущей процедуре. Если он не найден, выдается ошибка. Код в разделе Finally всегда выполняется последним, непосредственно перед тем, как блок обработки ошибок выйдет из области видимости, независимо от того, выполнен ли код в блоках Catch. В разделе Finally следует поместить код очистки, чтобы закрыть файлы и освободить объекты.
Обработка исключений 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!
Обработка исключений catch может "ловить" данные любого типа, но вовсе не обязательно при это указывать переменную. Т.е. прекрасно будет работать что-нибудь типа этого: catch(dumbclass) { } так же, как и catch(dumbclass&) { } Так же можно "поймать" и все исключения: catch(...) { }
Обработка исключений try { throw 1; // throw 'a'; } catch (long b) { cout << "пойман тип long: " << b << endl; } catch (char b) { cout << "пойман тип char: " << b << endl; }
Обработка исключений try { Main.Setup(); Main.Loop(); Main.Close(); } catch (Exception &e) { // использование класса, ведущего лог. log("Exception thrown: %s", e.String()); // Показываем сообщение об ошибке и закрываем приложение. }
Обработка исключений в стиле 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); }
Обработка исключений в стиле Microsoft set_terminate( term_func );
Препроцессор языка С #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 имя_макроса
Препроцессор языка С void main () { #if MAX>99 printf(“MAX>99\n”); #else printf(“MAX<99\n”); #endif return 0; }
Препроцессор языка С #if defined(MAX) && defined(MIN) #ifdef MAX #ifndef MAX #if defined(MAX) … #elif defined (MIN) … #else … #endif
Препроцессор языка С #pragma warn +xxx, -xxx, and .xxx #error Error N 3