Часть 2 Объектно-ориентированное
программирование
Введение. Эволюция технологии разработки ПО.
Процедурная и объектная декомпозиция
1.

«Стихийное» программирование – до середины 60-х годов ХХ века
– технология отсутствует – программирование – искусство создания
программ – в конце периода появляется возможность создания
подпрограмм – используется процедурная декомпозиция.
Основная программа

Программа

Данные

Данные
1

2

...

n

Подпрограммыглобальные данные.
Слабое место – большая вероятность испортить
1

Эволюция технологии разработки ПО (2)
2. Структурный подход к программированию - 60-70-е годы ХХ века –
технология, представляющая собой набор рекомендаций и
методов, базирующихся на большом опыте работы:

нисходящая разработка;

декомпозиция методом пошаговой детализации;

структурное программирование;

сквозной структурный контроль и т. д.
Основная программа
Глобальные данные

Данные

Данные
1

Подпрограммы с локальными данными

...
2

Данные
n1

2

Эволюция технологии разработки ПО (3)
Модульное программирование – выделение групп подпрограмм,
использующих общие глобальные данные в модули – отдельно
компилируемые части программы (многоуровневая декомпозиция).

Основная программа
Глобальные данные

Модуль 1

Модуль k

Данные

Данные

Данные

...
1

Подпрограммы с
локальными данными

Данные
n1

...

Данные

...
1

Данные
nk

Подпрограммы с
локальными данными

Модули с локальными данными и попрограммами
Слабое место – большое
количество передаваемых параметров.

3

Эволюция технологии разработки ПО (4)
3. Объектный подход к
программированию –
с середины 80-х до наших
дней.
Объектно-ориентированное
программирование –
технология создания
сложного программного
обеспечения, основанная
на представлении программы в виде системы объектов, каждый из которых является экземпляром определенного типа (класса),
а классы образуют иерархию с наследованием
свойств.

Объект 1
Данные
Данные

Данные

..
1

n1

Подпрограммы с
локальными данными
Сообщения
Объект 2

Объект S

Данные

Данные

Данные

..
1

..

Данные

Данные

n1

..
1

Подпрограммы с
локальными данными

Данные
nk

Подпрограммы с
локальными данными
Сообщения
Объект L
Данные
Данные

..
1

Подпрограммы с
локальными данными

Данные
n1

4

Эволюция технологии разработки ПО (5)
Компонентный подход – с конца 90-х годов ХХ века (COM-технология) – подключение объектов через универсальные интерфейсы –
развитие сетевого программирования – появление CASE-технологий.
Компьютер 2
Приложение 3

Компьютер 1
Приложение 1

Приложение 2

Библиотека

Объект
Объект

Объект

Операционная
система

Объект

Операционная
системаОбъект

5

Пример
Разработать программную систему, которая для указанной функции на
заданном отрезке:
– строит таблицу значений с определенным шагом;
– определяет корни;
– определяет максимум и минимум.

6

Формы интерфейса пользователя
Программа исследования функций.
Введите функцию или слово «Конец»: y = cos(x) – 1
Назначьте интервал: [-1, 0)
Введите номер решаемой задачи
( 1 – построение таблицы значений;
2 – нахождение корней;
3 – нахождение минимума и максимума;
4 – смена функции или завершение программы): 1

Построение таблицы.
Введите шаг: 0.01
Таблица значений:
x=
y=


Нахождение корней.
Таблица корней:
x=
y=


Экстремумы.
Минимум:
x=
y=
Максимум:
x=
y=

7

Диаграмма состояний интерфейса
пользователя

Ввод
функции

«Конец»

4
Меню
1
2
Таблица

Корни

3
Экстремумы

8

Разработка схем алгоритмов методом
пошаговой детализации
Начало

Analyze(F..)

F, a, b

Cod

F =“End”

да

да

Cod = 4

нет
Translate
(F,fun)
Analyze
(fun,a,b)

F, a, b

Конец

нет
Cod

1
Table
(fun,a,b)

2
Roots
(fun,a,b)

3
Extremes
(fun,a,b)

Cod

Выход

9

Схема структурная программы
Main Program

Translate

Analyze

Table

Roots

Extremes

Процедурная декомпозиция – процесс разбиения программы на
подпрограммы.
Структурной называют декомпозицию, если:
• каждая подпрограмма имеет один вход и один выход;
• подпрограммы нижних уровней не вызывают подпрограмм верхних
уровней;
• размер подпрограммы не превышает 40-50 операторов.
10

Объектная декомпозиция
Объектная декомпозиция – процесс представления предметной
области задачи в виде отдельных функциональных элементов
(объектов предметной области), обменивающихся в процессе
выполнения программы входными воздействиями (сообщениями) .
Объект отвечает за выполнение некоторых действий, инициируемых
сообщениями и зависящих от параметров объекта.
Активизировать

Ввод
функции

Задать

Активизировать
Меню
Активизировать
Активизировать
Активизировать
Таблица

Корни
Рассчитать

Рассчитать

Функция

Экстремумы
Рассчитать

Объект предметной
области характеризуется:

именем;

состоянием;

поведением.
Состояние – совокупность
значений характеристик
объекта, существенных с
т. з. решаемой задачи.
Поведение – совокупность
реакций на сообщения.
11

Реализация объектов предметной области

Класс – это структурный тип данных, который включает описание
полей данных, а также процедур и функций, работающих с этими
полями данных.
Применительно к классам такие процедуры и функции получили
название методов.
Объект-переменная – переменная типа «класс».

12

Методы построения классов
1. Наследование – механизм, позволяющий
строить класс на базе более простого
посредством добавления полей и определения
новых методов.
При этом исходный класс, на базе которого
выполняется построение, называют
родительским или базовым, а строящейся класс
– потомком или производным классом.
Если при наследовании какие-либо методы
переопределяются, то такое наследование
называется полиморфным.
2. Композиция – механизм, позволяющий
включать несколько объектов других
классов в конструируемый.
3. Наполнение – механизм, позволяющих
включать указатели на объекты других
классов в конструируемый.

13

11 Объектная модель С++
11.1 Описание класса

Формат описания класса:
class
{ private:
;
protected: ;
public: ;
};
TSlovo

Пример: Объект – строка (Ex5_01)

-Len
-Ref
#Pos
+TSlovo()
+~TSlovo()
+GetCh()
+PrintPos()
14

Пример описания класса (файл Slovo.h)
class TSlovo
{ private:
int Len;
char *Ref;
protected: int Pos;
public:
TSlovo(char *ref,int pos=0);
Конструктор
inline ~TSlovo(void) {delete Ref;}
Деструктор
inline char GetCh(void)
{ char Chr=Pos
Пример описания методов (файл Slovo.cpp)
#include
#include
#include
#include

"stdafx.h"
"slovo.h"



TSlovo::TSlovo(char *ref,int pos):Pos(pos)
{ Len=strlen(ref);
Ref=new char[Len+1];
strcpy(Ref,ref);
}
void TSlovo::PrintPos(void)
{
cout
11.2 Объявление объектов и обращение к
полям
;
Примеры:
а) TPoint a,*b, c[5]; /* класс описан без конструктора или с
конструктором без параметров */
б) TSlovo D(“Это строка”, 4); //конструктор с параметрами
.
->
[] .
Ссылка

Self (Паскаль) ? this (С++)

Указатель

Пример: this->Pos
17

Тестирующая программа
Использует
OOP1.cpp

Реализует
Slovo.h

Slovo.cpp

#include "stdafx.h"
#include
#include ?Slovo.h"
int main(int argc, char* argv[])
{ TSlovo Greet("Hello World",6);
char Chr;
while (Chr=Greet.GetCh()) cout
11.3 Наследование
class :
{…};

Вид
наследования

Объявление поля в
базовом классе

Видимость в
производном
классе

private

private
protected
public

не видимо
private
private

protected

private
protected
public

не видимо
protected
protected

public

private
protected
public

не видимо
protected
public

19

Пример наследования Ex5_02 (Text.h)
TSlovo
TText
#Pos
+SetPos()
+PrintPos()
#include "f:\iva\primer.vc\lection\oopr1\slovo.h"
#include
class TText:public TSlovo
{
private:
int Pos;
public:
inline
TText(char *ref,int pos=0):TSlovo(ref),Pos(pos) {}
void SetPos() { TSlovo::Pos=Pos; }
inline
virtual void PrintPos();
};
20
void TText::PrintPos(){cout
Тестирующая программа
#include "stdafx.h"
#include "Text.h"
int main(int argc, char* argv[])
{
TText Greet("Hello World",6);
TText(char *ref,int pos=0):
TSlovo(ref),Pos(pos)
char Chr;
while (Chr=Greet.GetCh()) cout
11.4 Полиморфизм
Виды полиморфизма
Полиморфизм

«Чистый»

Перегрузка

Параметрическая

Переопределение
методов в иерархии

В пространствах
имен

Простой
полиморфизм

Шаблон

Сложный
полиморфизм

22

Полиморфизм
В теории
простой полиморфизм
сложный полиморфизм

В С++:
переопределение методов
виртуализация методов

Пример использования сложного п-ма (Ex5_03):
#include "stdafx.h"
#include "f:\iva\primer.vc\lection\oopr11\Ttext.h"
int main(int argc, char* argv[])
{ TSlovo SGreet("HELLO!!!"), *Ref=&SGreet;
TText Greet("Hello World",6);
Ref->PrintPos();
cout
11.5 Инициализация общих полей объектов
при отсутствии конструкторов
Пример:
class TPoint
{public: int x,y;
...};
int main()
{ TPoint A = {2,3};
TPoint *pB = {5,3};
TPoint C[]= {{4,5},{2,8},{7,6}};
...
}
24

11.6 Конструкторы. Список инициализации
Пример (Ex5_4):
class TPoint
{ private: int x,y;
public: TPoint(int ax,int ay){x=ax;y=ay;}
TPoint(){}
SetPoint(int ax,int ay) {x=ax;y=ay;}
...};
int main()
{ TPoint A, B(2,3), C[5], D[2] = {TPoint(2,4),TPoint(4,5)},
*E,

A

? ?

E

*I = new TPoint(4,6), *M = new TPoint[3], *S[3];

B

2 3

C

? ? ? ? ? ? ? ? ? ?

I

M
4 6

D

2 4 4 5

S
? ? ? ? ? ?

25

Распределение/освобождение памяти и
инициализация объектов в программе
A.SetPoint(2,3); A.Print();
A
B
C
B.Print();
? ?
2 3
? ? ? ? ? ? ? ? ? ?
for (i=0;iPrint();
for (i=0;i
Список инициализации.
Инициализация объектных полей
Формат элемента списка инициализации:
()
Примеры:
a) TPoint(int ax,ay): x(ax),y(ay) {}
б) class TLine
{ private:
const int x;
int &y;
TPoint t;
public: TLine(int ax,int ay,int tx,int ty):
x(ax),y(ay),t(tx,ty){}
TLine(){}
Автоматически вызывает
...};
конструктор объектного поля
без параметров TPoint( ) ! 27

11.7 Копирующий конструктор
Автоматически вызывается:
а) при использовании объявлений типа
TPoint A(2,5),B=A;
б) при передаче параметров-объектов по значению, например:
void Print(TPoint R) {…}
Формат:
(const &){…}
Примеры:
а) TPoint(const TPoint &Obj)
{x=Obj.x; y=Obj.y;}

Строится
автоматически

б) TPoint(const TPoint &Obj)
{x=Obj.x; y=2*Obj.y;}
28

Пример обязательного определения
копирующего конструктора (Ex5_05)
#include "stdafx.h"
A
B
pn
#include
class TNum
{ public:
int *pn;
TNum(int n){puts("new pn"); pn=new int(n);}
TNum(const TNum &Obj)
{puts("copy new pn"); pn=new int(*Obj.pn);}
~TNum(){puts("delete pn");delete pn;}
};
void Print(TNum b) { printf("%d ",*b.pn); }
int main(int argc, char* argv[])
{ TNum A(1);
Print(A); return 0;
}

29

11.8 Конструкторы и деструкторы
производных классов
A

A(){…}

B

B():A(),{}

C

C():B(),{}

При объявлении объектов производного класса всегда
вызывается конструктор базового класса.
Если в списке инициализации конструктора производного
класса вызов конструктора базового отсутствует, то
автоматически вызывается конструктор базового класса
без параметров
30

Порядок вызовов конструкторов и деструкторов
для объектов производных классов (Ex5_06)
#include "stdafx.h"
#include
class TNum
{ public:
int n;
TNum(int an):n(an) {puts("TNum(an)");}
TNum() {puts("TNum()");}
~TNum(){puts("~TNum");}
Неявный вызов
};
конструктора TNum
class TNum2:public TNum
{ public:
int nn;
TNum2(int an):nn(an) {puts("TNum2(an)");}
~TNum2(){puts("~TNum2");}
TNum()
};
TNum2(an)
int main(int argc, char* argv[])
~TNum2
{TNum2 A(1);
return 0;}
~TNum
31

11.9 Абстрактные методы и классы
Абстрактный метод.
class AClass
{ …
virtual int Fun(int,int)=0;
}
Класс, содержащий абстрактный метод, называется
абстрактным.
Объекты абстрактного класса создавать запрещено !

32

11.10 Множественное наследование.
Виртуальное наследование
TA

TB

TC

TD

Проблема:
дублирование
полей
базового
класса

class : virtual
{ ...};
Порядок вызовов конструкторов:


конструктор виртуально наследуемого базового класса,



конструкторы базовых классов в порядке их перечисления при
объявлении производного класса,



конструкторы объектных полей и конструктор производного класса.
33
Деструкторы соответственно вызываются в обратном порядке.

Пример множественного виртуального
наследования
#include "stdafx.h"
#include
class TA
{ protected:
int Fix;
public:
TA() { cout
Пример множественного виртуального
наследования (2)
class TC:virtual private TA
{ public:
int Two;
TC() { cout
11.11 Приведение типов объекта
В С++ для приведения типов используют:
1) () - используется в Си/С++ для любых
типов, ничего не проверяет;
2) static_cast ()- используется в С++
для любых типов, ничего не проверяет;
3) reinterpret_cast
()используется в С++ для указателей, ничего не проверяет;
4) dynamic_cast
() – используется
в С++ для полиморфных классов, требует указания опции
компилятора /GR (Project/Settings…), если приведение
невозможно, то возвращает NULL.

36

Пример приведения типов объектов (Ex5_07)
#include "stdafx.h"
#include
#include
class TA

c

TA

TA()
func()

TB
{ protected:
char c;
S
public: TA(char ac):c(ac){}
TB()
virtual void func(){cout
Пример приведения типов объектов(2)
int main(int argc, char* argv[])
{ TA *pA=new TA('A'),*pC=new TB("AB");
TB *pB=new TB("AC");
((TA *)pB)->func();
reinterpret_cast(pB)->func();
static_cast(pB)->func();
dynamic_cast(pB)->func();

Восходящее
приведение

((TB *)pC)->func();
reinterpret_cast(pC)->func();
static_cast(pC)->func();
dynamic_cast(pC)->func();

Нисходящее
приведение

((TB *)pA)->func();
Ошибка!
reinterpret_cast(pA)->func();
Приведение
static_cast(pA)->func();
не корректно
// dynamic_cast(pA)->func();
if (TB *pD=dynamic_cast(pA)) pD->func();
else cout
11.12 Контейнер «Двусвязный список» (Ex5_08)

Диаграмма классов

39

Контейнер «Двусвязный список»(2)
Диаграмма компоновки

40

Файл Element.h
#include

class TElement
{ public:
TElement *pre,*suc;
TElement() { pre=suc=NULL;}
virtual ~TElement() { puts("Delete TElement.");}
virtual void Print()=0;
};
class TSpisok
{ private: TElement *first,*last,*cur;
public: TSpisok() {first=last=cur=NULL;}
~TSpisok();
void Add(TElement *e);
TElement *Del();
void ForEach(void (*f)(TElement *e));
TElement *First(){return cur=first;}
TElement *Next(){return cur=cur->suc;}
TElement *Last(){return cur=last;}
TElement *Previous(){return cur=cur->pre;}
41
};

Файл Element.cpp
#include "stdafx.h"
#include "Element.h"
TSpisok::~TSpisok()
{

puts("Delete TSpisok");
while ((cur=Del())!=NULL)

{ cur->Print();
delete(cur);

}

}
void TSpisok::Add(TElement *e)
{

if (first==NULL) first=last=e;
else

{ e->suc=first;
first->pre=e;
first=e;

}

}

42

Файл Element.cpp (2)
TElement *TSpisok::Del(void)
{

TElement *temp=last;
if (last!=NULL)
{last=last->pre;
if (last!=NULL) last->suc=NULL;
}
if (last==NULL) first=NULL;
return temp;

}
void TSpisok::ForEach(void (*f)(TElement *e))
{

cur=first;
while (cur!=NULL)
{(*f)(cur);
cur=cur->suc;
}

}

43

Файл Num.h
#include "Element.h"
class TNum:public TElement
{ public: int num;
TNum(int n):TElement(),num(n) {}
~TNum() { puts("Delete TNum.");}
void Print() { printf("%d ",num); }
};
class TChar:public TElement
{ public: char ch;
TChar(char c):TElement(),ch(c) {}
~TChar() { puts("Delete TChar.");}
void Print() { printf("%c ",ch);}
};
void Show(TElement *e);

Файл Num.cpp
#include "stdafx.h"
#include "Num.h"
void Show(TElement *e)
{ e->Print();}

44

Тестирующая программа
#include "stdafx.h"
#include "Num.h"
#include
#include
TSpisok N;
int main(int argc, char* argv[])
{ char str[10];
int k,i;
TElement *p;
while(printf("Input numbers, strings or :"),
scanf("%s",str),strcmp(str,"end"))
{ k=atoi(str);
if (k||(strlen(str)==1 && str[0]=='0')) p=new TNum(k);
else p=new TChar(str[0]);
N.Add(p);
}
puts("All list:");
N.ForEach(Show);
45

Тестирующая программа(2)
p=N.First(); k=0;
while (p!=NULL)
{ if (TNum *q=dynamic_cast(p)) k+=q->num;
// установить создание RTTI (/GR в Project\Settings...)
p=N.Next();
}
printf("Summa= %d\n",k);
p=N.Last();
i=0;
while (p!=NULL)
{if (TChar *q=dynamic_cast(p)) str[i++]=q->ch;
p=N.Previous();
}
str[i]='\0';
printf("String= %s\n",str);
return 0;
}

46

11.13 Статические компоненты класса
Объявляются с описателем Static
Статические поля являются общими для всех объектов класса и
существуют даже при отсутствии объектов. Инициализация
статических полей в определении класса не допустима.
Статические методы не получают параметра this и,
следовательно, не могут без указания объекта обращаться к
нестатическим полям.
Для доступа к статическим компонентам вне компонентных
функций используют квалификатор ::

47

Статические компоненты класса (Ex5_09)
Пример. Создать список объектов

first

last

next

next

Сегмент данных
Файл Statico.h
#include
#include
class TPoint
{ public: char ch1,ch2;
static TPoint *first, *last;
TPoint *next;
TPoint(char ach1,char ach2);
void Draw()
{ printf("%c
%c \n",ch1,ch2); }
static void DrawAll();
};

next

o

48

Файл Statico.cpp
#include "stdafx.h"
#include "statico.h"
TPoint *TPoint::first=NULL,*TPoint::last=NULL;
TPoint::TPoint(char ach1,char ach2)
{ ch1=ach1; ch2=ach2;
next=NULL;
if(first==NULL)first=this;
else last->next=this;
last=this;
}
void TPoint::DrawAll()
{ TPoint *p=first;
if(p==NULL)return;
do {p->Draw();
p=p->next;}
while(p!=NULL);
}

49

Тестирующая программа
#include "stdafx.h"
#include "statico.h"
int main(int argc, char* argv[])
{ TPoint A('S','C'),B('W','O'),C('M','S');
if(TPoint::first!=NULL) TPoint::DrawAll();
return 0;
}
S C
W O
M S
50

11.14 Дружественные функции и классы
Описываются с описателем friend, что обеспечивает
доступ к внутренним компонентам класса
Пример:
class TPoint
{private: int x,y;
public:...
friend void Show(TPoint A); // функция
};
void Show(TPoint A){cout
11.15 Переопределение операций
Операции

Типы функций-операций:

1. Независимая функция-операция
а) operator@()
б) operator@(,)
2. Компонентная функция-операция
а) operator@( ) // Операнд = Объект
б) operator@() // Операнд1 = Объект

Формы вызова
а) стандартная
operator@()
operator@(,)

б) операторная
@
@

. operator@( )
. operator@()

@
@

52

Переопределение операций
1. Можно переопределять только операции, параметры которых –
объекты.
2. Не разрешается переопределение *, sizeof, ? :, #, ##, ::, Class::.
3. Операции =, [ ], ( ) можно переопределять только в составе класса
4. При переопределении операций нельзя изменить ее приоритет и
ассоциативность.

53

Пример 1. Класс «Точка» (Ex5_10)
Файл Tpoint.h
#include
class TPoint{
private:
float x,y;
public:
TPoint(float ax,float ay):x(ax),y(ay)
{cout
Файл Tpoint.cpp
#include "stdafx.h"
#include "Tpoint.h"
TPoint& TPoint::operator+=(TPoint &p)
{ x+=p.x; y+=p.y;
cout
Тестирующая программа
#include "stdafx.h"
#include "Tpoint.h"
int main(int argc, char* argv[])
Constructor
{
TPoint p(2,3),q(4,5),r(7,8);
Constructor
p+=r;
Constructor
Operator +=
p.Out();
q=p+r;
TPoint pp(x,y);
Constructor (pp)

q.Out();
return 0;
}

Оperator +
Operator +=
Copy constructor
Destructor (pp)
Operator =
Destructor
Destructor
Destructor
Destructor

cout
Пример 2. Класс «Строка»(Ex5_11)
Файл S.h:
#include
#include
#include
#include
class String
{ private:
char *str,name;
int len;
public: String(int Len,char Name);
String(char *vs,char Name);
String(String &S);
~String();
int Length(){return len;}
char operator[](int n)
{return ((n>=0)&&(n
Файл S.cpp
#include "stdafx.h"
#include "s.h"
String::String(int Len,char Name){ len=Len;
str=new char[len+1]; str[0]='\0'; name=Name;
cout
Файл S.cpp (2)
String::String(String &S)
{
len=S.Length();
str=new char[len+1];
strcpy(str,S.str);
name='K';
cout
Файл S.cpp (3)
String

String::operator+(String &A)
{ cout
Файл S.cpp (3)
String& String::operator=(String &S)
{
cout
Тестирующая программа
#include "stdafx.h"
#include "s.h"
int main(int argc, char* argv[])
{
String A("ABC",'A'),B("DEF",'B'),C(6,'C');
C.print();
C=A+B;
C.print();
C=C+'a';
C.print();
return 0;
}

62

Выполнение операций
Выполняемые операторы
C=A+B;

String operator+(String &A)
{ cout
11.16 Параметризованные классы (шаблоны)
Формат описания шаблона класса:
template
Формат объявления объектов:

()
Пример. Динамический массив
(Ex5_12)

64

Файл A.h
#include
template
class TArray
{ type * content;
int size;
public:
TArray(int asize)
{ content = new type [size=asize];}
~TArray (){delete [] content;}
type & operator[] (int x)
{ if ((x=size))
{ cerr
Тестирующая программа
№include "stdafx.h"
#include "A.h"
#include
int main(int argc, char* argv[])
{int i;
TArray int_a(5);
TArray char_a(5);
for (i=0;i
11.17 Параметризованные функции
Формат описания шаблона функции:
template
Пример. Шаблон функции определения
максимального (Ex5_13)
#include "stdafx.h"
#include
#include
template
T max(T x, T y){ return(x>y)?x:y;}
char * max(char * x, char * y)
{ return strcmp(x,y) > 0? x:y;}

67

Тестирующая программа
int main(int argc, char* argv[])
{

int a=1,b=2;
char c='a', d='m';
float e=123, f=456;
double p=234.567,t=789.23;
char str1[]="AVERO", str2[]="AVIER";
cout
Контейнер на основе шаблона (Ex5_14)

contents

69

Объявление шаблона класса
#include
template
class arrayob
{ type **contents; int size; int n;
public:
arrayob(int number){contents=new type *[size=number];}
~arrayob ();
int sizeofmas(){return n;}
void add(type *p) { if(n==size)cerr
Объявление шаблона функции
template
arrayob ::~arrayob ()
{for(int i=0;i
Файл N.h
#include
#include
class TNum
{ public:
int num;
TNum(int n):num(n) {}
virtual ~TNum(void) {cout
Тестирующая программа
#include "stdafx.h"
#include
#include
#include "A.h"
#include "N.h"
arrayob ob_a(5);
int main(int argc, char* argv[])
{ int n,i;
char S[10];
for(i=0;i





Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.