Слайд 1Язык С++
Лекция №7
Объектно-ориентированное программирвоание в С++
Слайд 2Класс point
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); // изменение цвета точки
};
Слайд 3Реализация методов класса 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(); }
Слайд 4Что даст непосредственное наследование?
// Класс Окружность
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(); }
Вызов наследуемого конструктора с параметрами
Слайд 5Использование классов point и circ
// главная программа
void main(void)
{
point p(0,240);
circ c(0,240);
for (int
i=0; i<640; i++)
{ p.move(i,240);
c.move(i,240);
delay(10);
}
p.~point();
c.~point();
}
void point::move(int u, int v)
{
hide();
x=u; y=v;
show(); // но это метод точки
}
Слайд 6Как работают виртуальные правила
void point::move(int u, int v)
{
hide();
x=u; y=v;
show();
}
«Заглушка»
«Заглушка»
Позднее
связывание. Что такое hide и show будет известно лишь во время выполнения программы.
Слайд 7Как реализованы виртуальные правила
Эти адреса заполняются конструктором
Слайд 8Виртуальные правила
// Класс Точка
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; };
};
Слайд 9Использование классов point и circ
// главная программа
void main(void)
{
point p(0,240);
circ c(0,240);
for (int
i=0; i<640; i++)
{ p.move(i,240);
c.move(i,240);
delay(10);
}
p.~point();
c.~point();
}
void point::move(int u, int v)
{
hide(); // для точки
x=u; y=v;
show(); // для точки
}
void point::move(int u, int v)
{
hide(); // для окружности
x=u; y=v;
show(); // для окружности
}
Слайд 10Наследование и виртуальные правила
// Класс Квадрат
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); }
Слайд 11Полиморфизм посредством указателей на объекты
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();
}
Слайд 12Операторы new и delete
Оператор new
type * t = new type(параметры)
Размещаемый
оператор new
new (адрес размещения) тип;
new (адрес размещения) тип(параметры);
Оператор delete
delete(t) //
деструктор вызывается автоматически
Операторы можно переопределить в классе
Слайд 13Передача объектов как аргументов функции
class obj { }
Слайд 14Дружественные функции, дружественные классы
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) }
Дружественная функция имеет доступ к private полям класса
Слайд 15Дружественные функции-операции
#include
// Перегрузка операций ввода/вывода
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);
};
Слайд 16Дружественные функции-операции
// vector inserter
ostream & operator
vector obj)
{ stream
<< obj.y << ",";
stream << obj.z << ")\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;
}
Слайд 17Абстрактные функции
class color
{protected:
int c; // цвет
public:
color (int z) { c=z; } // конструктор
int getcolor() { return c; }
};
class figure
{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();}
Слайд 18Множественное наследование
// множественное наследование
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)
{ // figure f(320,240,10); // так нельзя!
circus cr(320,240,10,YELLOW);
cr.show();
}
Слайд 19Статические члены класса
class st
{
static int c; //
статическое поле
public:
static int incr(void) { return c++; } //
статическая функция
st(void) {cin << incr(); }
~st(void) { c--; }
}
. . . .
st::c=0;
st::incr();
Слайд 20Шаблоны функций
template // Шаблоны функций
T sqr (
T x )
{
return x*x ;
}
main()
{
int i = 3;
float x = 3.1;
cout << sqr(i) << "\n"; // создает экземпляр int sqr(int)
cout << sqr(x) << "\n"; // создает экземпляр float sqr(float)
}
template inline T sqr ( T x )
{
return x*x ;
}
Слайд 21Шаблоны класса
template class Queue
{public:
Queue();
const Type& front();
void push(const Type&)
void pop();
private:
…
};
Queue qi; // Очередь, содержащая целые числа
Queue< vector > qv; // Очередь, содержащая целые числа
Queue qi; // Очередь, содержащая строки
template class Queue
Слайд 22Шаблон класса c параметром
template class vec
{
private:
T *q;
int n;
public:
vec
(void);
};
template vec::vec(void)
{ q = new T[size];
};
void main()
{ vec d;
vec k;
}
Слайд 23Обработка исключений
try (пытаться) - начало блока исключений;
catch (поймать) -
начало блока, "ловящего" исключение;
finally (завершение) – всегда выполняется последним
throw
(бросить) - ключевое слово, "создающее" ("возбуждающее") исключение.
Слайд 24Обработка исключений
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!
Слайд 25Обработка исключений
catch может "ловить" данные любого типа, но вовсе не
обязательно при это указывать переменную. Т.е. прекрасно будет работать что-нибудь
типа этого:
catch(dumbclass) { }
так же, как и
catch(dumbclass&) { }
Так же можно "поймать" и все исключения:
catch(...) { }
Слайд 26Обработка исключений
try { throw 1;
// throw
'a';
}
catch (long b)
{
cout << "пойман тип long: " << b << endl;
}
catch (char b)
{ cout << "пойман тип char: " << b << endl;
}
Слайд 27Обработка исключений
try {
Main.Setup();
Main.Loop();
Main.Close();
}
catch (exception
&e)
{ // использование класса, ведущего лог.
log("Exception thrown: %s", e.String());
// Показываем сообщение об ошибке
// и закрываем приложение.
}
Слайд 28Стандартные исключения
try {
b1[1233]=3;
}
catch (std::out_of_range)
{
cout
}
Слайд 29Стандартные исключения
try {
b1[1233]=3;
}
catch (std::out_of_range)
{
cout
}
Слайд 30Стандартные классы исключений, определенные в заголовке stdexcept
Слайд 31Обработка исключений в стиле Microsoft
#include
#include
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);
}
Слайд 32Обработка исключений в стиле Microsoft
set_terminate( term_func );
Слайд 33Еще о пространствах имен
namespace foo
{
int bar;
}
using namespace foo;
Слайд 34Пространства имен
namespace Namespace12
{
int foo;
}
void func1()
{
using namespace Namespace12;
// теперь все имена из пространства имён Namespace12
// будут
видны здесь без дополнительных префиксов
++foo;
}
void func2()
{
// а тут имя нужно уточнить:
Namespace12::foo = 42;
}