Технология ООП
Санкт-Петербургский государственный политехнический университет
20 сентября 2011
Технология ООП
Спецификаторы для данных и методов
s t r u c t Man
{
char ∗ Name ;
i n t Age ;
i n t age ( ) { r e t u r n Age ; }
};
Man man ;
man . age ( ) ;
man . Age ;
Технология ООП
Спецификаторы для данных и методов
private
public
protected
c l a s s Man
{
char ∗ Name ;
i n t Age ;
public :
i n t age ( ) { r e t u r n Age ; }
};
Man man ;
man . age ( ) ;
man . Age ; // не бу де т р а б о т а т ь
Технология ООП
Конструкторы и деструкторы
Конструктор — служит для начальной инициализации объекта
при его создании.
Деструктор — вызывается при прекращении жизни объекта,
используется для освобождения динамически выделенной
памятию.
Технология ООП
Конструктор
Носит такое же имя как и класс, не имеет типа возвращаемого
значения.
c l a s s Man
{
char Name [ 1 0 0 ] ;
i n t Age ;
public :
Man( char ∗name ) { s t r n c p y ( Name , name , 1 0 0 ) ; }
Man ( ) { s t r n c p y ( Name , " t e s t " , 1 0 0 ) ; } // к о н с т р у к т о р
по умолчанию
Man( i n t age = 1 0 0 ) { Age = age ; }
};
Технология ООП
Конструктор
Man : : Man( i n t v a l u e 1 , i n t v a l u e 2 )
{
var1 = value1 ;
var2 = 5;
}
Man : : Man( i n t v a r 1 , i n t v a r 2 ) : v a r 1 ( v a l u e 1 ) , v a r 2
(5)
{
}
Технология ООП
Конструктор копирования
Срабатывает при инициализации объекта класса другим
объектом.
c l a s s Man
{
char ∗Name ;
public :
Man( const &name ) { s t r n c p y ( Name , name . Name , 1 0 0 ) }
};
Технология ООП
Деструкторы
Срабатывает при окончании времени жизни объекта. Не имеет
параметров.
c l a s s Man
{
char ∗Name ;
public :
~Man ( ) { d e l e t e Name ; }
};
Можно вызвать деструктор явно obj-> Man();
Технология ООП
Указатель this
Указатель на текущий объект, используется неявно для
обращения к элементам объекта.
c l a s s Man
{
i n t Age ;
public :
i n t age ( ) { r e t u r n Age ; }
Man ∗ o b j ( ) { r e t u r n t h i s ; }
// i n t age ( ) { r e t u r n t h i s −>Age ; }
};
Технология ООП
Дружественные функции
Дружественные функции позволяют получить доступ к private
членам класса.
c l a s s Man
{
i n t Age ;
f r i e n d v o i d s e t A g e (Man ∗ , i n t ) ;
public :
v o i d s e t A g e ( i n t age ) { Age = age ; }
};
v o i d s e t A g e (Man ∗man , i n t age )
{
man−>Age = age ;
}
Технология ООП
Дружественные функции
c l a s s Man ;
c l a s s User
{
public :
v o i d age (Man &, i n t ) ;
};
c l a s s Man
{
i n t Age ;
f r i e n d v o i d U s e r : : age (Man &, i n t ) ;
};
v o i d U s e r : : age (Man &man , i n t age )
{
man . Age = age ;
}
Технология ООП
Дружественный класс
Дружественный класс позволяет сделать все функции класса
дружественными.
c l a s s Man ;
c l a s s User
{
public :
v o i d age (Man &, i n t ) ;
};
c l a s s Man
{
i n t Age ;
f r i e n d c l a s s User ;
};
v o i d U s e r : : age (Man &man , i n t age )
{
man . Age = age ;
}
Технология ООП
Статические члены класса
Члены класса для которых память выделяется один раз при
создании класса.
c l a s s Man
{
private :
s t a t i c i n t count ;
public :
s t a t i c i n t getCount ( ) { return count ; }
};
i n t x = Man : : g e t C o u n t ( ) ;
Технология ООП
Спецификатор const
Используется для предотвращения изменения данных.
c l a s s Man
{
private :
i n t Age ;
public :
v o i d age ( i n t _age ) const // нельзя изменять члены
класса
{
Age = _age ; // ошибка
}
v o i d cha n ge ( const Man& man )
{
man . Age = 5 ; // ошибка
}
};
Технология ООП
Перегрузка операций
В C++ можно перегрузить любые операции, кроме: ’.’, ’.*’,
’ ?:’, ’::’, ’#’, ’##’, ’sizeof’.
Для стандартных типов переопределить операции нельзя.
Функции-операции не могут иметь аргументов по
умолчанию, наследуются за исключением операции ’=’.
При перегрузке сохраняется число аргументов, а также
приоритет операции.
тип o p e r a t o r операция ( список параметров ) { тело
функции}
Технология ООП
Перегрузка унарных операций
c l a s s Man
{
i n t Age ;
Man & o p e r a t o r ++() { ++Age ; r e t u r n ∗ t h i s ; }
};
Man man ;
++man ;
Технология ООП
Перегрузка бинарных операций
c l a s s Man
{
i n t Age ;
public :
i n t getAge ( ) { r e t u r n Age ; }
};
bool o p e r a t o r >( const Man &m1 , const Man &m2)
{
i f (m1 . getAge ( ) > m2 . getAge ( ) )
return true ;
return f a l s e ;
}
Технология ООП
Перегрузка бинарных операций
c l a s s Man
{
i n t Age ;
Man o p e r a t o r +( const Man &m2)
{
Man temp ;
temp . Age = Age + m2 . Age ;
r e t u r n temp ;
}
};
Man man1 , man2 ;
man1 = man1 + man2 ;
Технология ООП
Операция присваивания
c l a s s Man
{
i n t Age ;
char ∗Name ;
const Man & o p e r a t o r = ( const Man &m1) { ... }
};
Технология ООП
Безопасный массив
Перегрузить для класса массив операцию [].
//TODO
Технология ООП
Наследование
c l a s s имя : [ p r i v a t e | p r o t e c t e d | p u b l i c ]
базовый_класс
Простое наследование — наследование от одного родителя.
Технология ООП
Простое наследование
c l a s s Man
{
char ∗Name ;
i n t Age ;
};
c l a s s Stud : p u b l i c Man
{
i n t Course ;
};
c l a s s P r o f : p u b l i c Man
{
char ∗ Dept ;
};
Технология ООП
Простое наследование
c l a s s Man
{
char ∗Name ;
i n t Age ;
};
c l a s s Stud : p u b l i c Man
{
i n t Course ;
};
c l a s s P r o f : p u b l i c Man
{
char ∗ Dept ;
};
Технология ООП
Простое наследование
c l a s s Man
{
char ∗Name ;
i n t Age ;
public :
i n t getAge ( ) { r e t u r n Age ; }
};
c l a s s Stud : p u b l i c Man
{
i n t Course ;
public :
i n t getAge ( ) { r e t u r n getAge ( ) ; } //FIXME
Stud ( ) { p r i n t f ( "%d\n" , getAge ( ) ) ; }
};
c l a s s P r o f : p u b l i c Man
{
char ∗ Dept ; Технология ООП
Вызов конструкторов и деструкторов при наследовании
Конструкторы вызываются от более старшего класса к
младшему, деструкторы наоборот.
Технология ООП
Множественное наследование
class A { . . . };
class B : public A { . . . };
class C : public A { . . . };
class D : public A, public B, public C { . . . };
Объект класса D содержит унаследованные члены класса A в
3х экземплярах.
Технология ООП
Множественное наследование
class A { . . . };
class B : virtual public A { . . . };
class C : virtual public A { . . . };
class D : public A, public B, public C { . . . };
Технология ООП
Виртуальные методы
Man ∗man = new Stud ;
man−>age ( ) ;
Будет вызван метод класса Man. Механизм раннего
связывания.
Технология ООП
Виртуальные методы
v i r t u a l i n t age ( ) { . . . }
Man ∗man , ∗man2 ;
man = new Stud ;
man2 = new Man ;
man−>age ( ) ;
man2−>age ( ) ;
Механизм позднего связывания.
Технология ООП
Виртуальные методы
Если в базовом классе метод виртуальныaй, то в
производном классе такойже метод становится
автоматически виртуальным.
Виртуальные методы наследуются.
Нельзя объявить как static.
Можно определить вирутальный метод, как «чисто
виртуальный» присвоив ему значение 0.
Деструктор базового класса как правило всегда следует делать
виртуальным, чтобы избежать утечек памяти.
Технология ООП
Абстрактные классы
Абстрактный класс — класс имеющий «чисто виртуальные»
функции, объект такого класса не может быть создан, а только
унаследован.
Технология ООП