0% нашли этот документ полезным (0 голосов)
2 просмотров23 страницы

CPP 4

Документ описывает технологии объектно-ориентированного программирования (ООП) с акцентом на шаблоны классов и преобразования типов в C++. Приводятся примеры реализации классов, таких как Queue и List, а также объясняются различные методы преобразования типов, включая dynamic_cast, static_cast и reinterpret_cast. Также упоминаются спецификаторы класса памяти и inline-функции.

Загружено:

e102.gamma
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
2 просмотров23 страницы

CPP 4

Документ описывает технологии объектно-ориентированного программирования (ООП) с акцентом на шаблоны классов и преобразования типов в C++. Приводятся примеры реализации классов, таких как Queue и List, а также объясняются различные методы преобразования типов, включая dynamic_cast, static_cast и reinterpret_cast. Также упоминаются спецификаторы класса памяти и inline-функции.

Загружено:

e102.gamma
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

Технология ООП

Санкт-Петербургский государственный политехнический университет

27 сентября 2011

Технология ООП
Шаблоны классов

c l a s s Queue {
public :
Queue ( ) ;
~Queue ( ) ;

i n t& remove ( ) ;
v o i d add ( const i n t & ) ;
bool is_empty ( ) ;
bool i s _ f u l l ( ) ;
private :
};
Queue q i ;

Технология ООП
Шаблоны классов

template <c l a s s Type>


c l a s s Queue {
public :
Queue ( ) ;
~Queue ( ) ;

Type& remove ( ) ;
v o i d add ( const Type & ) ;
bool is_empty ( ) ;
bool i s _ f u l l ( ) ;
private :
};
Queue<i n t > q i ;

Технология ООП
Шаблоны классов

t y p e d e f double Type ;
template <c l a s s Type>
c l a s s QueueItem {
public :
private :
Type i t e m ;
QueueItem ∗ n e x t ;
};

Технология ООП
Шаблоны классов

template<c l a s s T = char> c l a s s S t r i n g ;
S t r i n g <> ∗p ;

Технология ООП
Шаблоны классов

template<c l a s s L i s t >
class List
{
public :
void p r i n t ( ) ;
};
template <c l a s s Data> v o i d L i s t <Data > : : p r i n t ( ) ;

Технология ООП
Шаблоны классов

template<c l a s s L i s t >
class List
{
public :
void p r i n t ( ) ;
};
template <c l a s s Data> v o i d L i s t <Data > : : p r i n t ( ) ;

Технология ООП
Шаблоны классов

template< template<c l a s s U> c l a s s V> c l a s s C {


V<i n t > y ;
V<i n t ∗> y1 ;
};

Технология ООП
Шаблоны классов

#i n c l u d e <i o s t r e a m >
template <i n t N>
struct Factorial {
enum { v a l = F a c t o r i a l <N−1 >:: v a l ∗ N } ;
};
template<>s t r u c t F a c t o r i a l <0>{
enum { v a l = 1 } ;
};
i n t main ( ) {
s t d : : c o u t << F a c t o r i a l <4 >:: v a l << "\n" ; } // на э т а п е
компиляции

Технология ООП
Шаблоны классов

template<c l a s s T> v o i d f ( ) { T : : x ∗ p ; . . . }
template<c l a s s T> v o i d f ( ) { typename T : : x ∗ p ; ...
}

Технология ООП
Не стоит злоупотреблять шаблонами

. . / g l o b a l . h : 1 4 5 : e r r o r : i n p a s s i n g argument 3 o f ‘
i n t v s t d : : f i n d P o s ( const s t d : : v
e c t o r <T1 , s t d : : a l l o c a t o r <_CharT> >&, const T2&,
Func&) [ w i t h T1 = s t d : : p a i r <c o n s
t C G H e r o I n s t a n c e ∗ , CPath ∗>, T2 = const
C A r m e d I n s t a n c e ∗ , Func = b o o s t : : _bi : : bind_
t<bool , bool ( ∗ ) ( const s t d : : p a i r <const
C G H e r o I n s t a n c e ∗ , CPath∗>&, const CGHeroIn
s t a n c e ∗ const s t d : : p a i r <const C G H e r o I n s t a n c e ∗ ,
CPath ∗ > : : ∗ , const C A r m e d I n s t a n c e ∗
const &) , b o o s t : : _bi : : l i s t 3 <b o o s t : : arg <1> ( ∗ ) ( ) ,
b o o s t : : _bi : : v a l u e <const CGHeroI
n s t a n c e ∗ s t d : : p a i r <const C G H e r o I n s t a n c e ∗ , CPath
∗ >::∗ > , b o o s t : : arg <2> ( ∗ ) ( )> >] ’

Технология ООП
Спецификаторы класса памяти

auto
register
static
extern

Технология ООП
inline-функции

inline double Sqr(double x) return x*x;

Технология ООП
Спецификатор volatile

volatile int i;

Технология ООП
Преобразования типов

Операция const_cast.
v o i d p r i n t ( i n t ∗p ) { c o u t << ∗p ; }
const i n t ∗p ;
p r i n t ( p ) ; // ошибка
i n t ∗ j = const_cast<i n t ∗>(p ) ;

Технология ООП
mutable
class mutable_test
{
int data ;
mutable s y n c s y n c _ o b j ;
public :
void set_data ( i n t i )
{
sync_obj . l o c k ( ) ;
data = i ;
sync_obj . unlock ( ) ;
}
i n t get_data ( ) const
{
sync_obj . l o c k ( ) ;
int i = data ;
sync_obj . unlock ( ) ;
return i ;
}
};
Технология ООП
Преобразование типов

Операция dynamic_cast. Преобразования бывают двух типов:


повышающее – приведение производного класса к
базовому
понижающее — из базового класса в производный
перекрестное — приведение между производными типами

Технология ООП
dynamic_cast

Повышающее преобразование.
c l a s s B{ . . . } ;
c l a s s C : p u b l i c B{ . . . } ;
C ∗ c = new C ;
B ∗b = dynamic_cast<B∗>( c ) ; // Эквивалентно B ∗b = c
;

Технология ООП
dynamic_cast

Понижающее преобразование. Применяется когда компилятор


не может проверить правильность приведения. Для
использования данного типа преобразований необходимо
включить механизм RTTI.
c l a s s B{ p u b l i c : v i r t u a l v o i d f 1 ( ) {} } ;
c l a s s C : p u b l i c B{ p u b l i c : v o i d f 2 ( ) {} } ;
C ∗ c = new C ;
B ∗b = new B ;
C ∗ temp = dynamic_cast<C∗>(b ) ;
i f ( temp )
temp−>f 2 ( ) ;

Технология ООП
dynamic_cast

Перекрестное преобразование.
c l a s s B{ p u b l i c : v i r t u a l v o i d f 1 ( ) {} } ;
c l a s s C : p u b l i c B{ p u b l i c : v o i d f 2 ( ) {} } ;
c l a s s D : p u b l i c B{ . . . } ;
D ∗d = new D ;
C ∗ temp = dynamic_cast<C∗>(d ) ;
i f ( temp )
temp−>f 2 ( ) ;

Технология ООП
dynamic_cast

Для доступа к RTTI введена операция typeid и класс type_info.


class B { . . . };
class C : public B { . . . };
B ∗p = new C ;
i f ( t y p e i d ( ∗ p ) == t y p e i d (C) )
{
dynamic_cast<C∗>(p )−>f 2 ( ) ;
c o u t << t y p e i d ( ∗ p ) . name ( ) ;
}

Технология ООП
static_cast

Выполняется на этапе компиляции над:


целыми типами
целыми и вещественными типами
целыми и перечисляемыми типами
указателями и ссылками одной иерархии

Технология ООП
reinterpret_cast

Применяется для преобразования не связных между собой


типов, например указателей в целые и наоборот.
char ∗p = r e i n t e r p r e t _ c a s t <char ∗>( m a l l o c ( 1 0 ) ) ;

Технология ООП

Вам также может понравиться