
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор explicit.
- •Указатель this.
- •Абстрактные типы данных.
- •Операторы для динамического выделения и освобождения памяти (new и delete).
- •Перегрузка и переопределение функций.
- •Перегрузка бинарных операторов.
- •Перегрузка унарных операторов.
- •19.20.Перегрузка оператора new.Перегрузка оператора delete.
- •22.Inline-функции.
- •23.Вложенные классы
- •24.Static-компоненты данные класса
- •25.26.Static и const-компоненты функции класса
- •27.Использование new delete для реализации массивов
- •28.Организация внешнего доступа к локальным компонентам класса(friend)
- •29.Ссылки.Параметры ссылки
- •30.Ссылки.Независимые ссылки
- •31.Инициализация компонент-данных объекта. Конструктор с параметрами.
- •33.Наследование. Открытое, защищенное и закрытое.
- •34.Виртуальные функции.
- •35.Множественное наследование.
- •36.Множественное наследование и виртуальные базовые классы
- •38.Proxi-классы.
- •39.40.Пространство имен. Пространство имен как объявление. Пространство имен как директива.
- •41.Виртуальные функции
- •42.Параметризированные классы (шаблоны).
- •43.Шаблоны функций.
- •44.Передача в шаблон класса дополнительных параметров.
- •44.Совместное использование шаблонов и наследования.
- •45.Шаблоны класса и friend.
- •46.Реализация smart-указателя.
- •48.Транзакции.
45.Шаблоны класса и friend.
Для шаблонов класса, как и для обычных классов, могут быть установлены отношения дружественности. Дружественность может быть установлена между шаблонным классом и глобальной функцией, функцией-членом другого (возможно шаблонного класса) или целым классом (возможно шаблонным).
(ПРИМЕР ИЗ КОНСПЕКТА, НО ВЫДАЁТ ОШИБКУ)
template <class T>
class B;
template <class T>
class A
{
T *m;
int size;
public:
A(int size, T *m);
~A();
friend T fun1 (T&);
friend T B<T>::fun2(A<T> &);
};
template <class T>
class B
{
public:
T fun2(A<T> &);
};
template <class T>
void fun1(T &obj)
{
}
int main()
{
int m1[]={1,2,3};
A <int> a1(3,m1);
fun1(a1);
return 0;
}
46.Реализация smart-указателя.
Если при использовании в программе указателя на объект, память для которого выделена с помощью оператора new, объект становится не нужен, то для его разрушения необходимо явно вызвать оператор delete. В то же время на один объект могут ссылаться множество указателей и, следовательно, нельзя однозначно сказать, нужен ли еще этот объект или он уже может быть уничтожен.
template <typename T>
struct Status { T *RealPtr; int Count;
};
template <typename T>
class Point
{ Status <T> *StatPtr;
Public:
Point (T * ptr = 0);
Point(const Point & );
~Point();
Point & operator =(const Point &);
T * operator->() const;
T & operator*() const;
void get_count() {cout<<StatPtr->Count<<endl;}
};
template<typename T>
Point<T>::Point(T * ptr)
{ if(!ptr)
StatPtr = NULL;
else
{ StatPtr = new Status <T>; StatPtr->RealPtr=ptr; StatPtr->Count = 1;
}
}
template <typename T>
Point<T>::Point(const Point & p): StatPtr(p.StatPtr)
{ if(StatPtr) StatPtr->Count++;
}
template <typename T>
Point<T>::~Point()
{ if(StatPtr)
{ StatPtr->Count--;
if(StatPtr->Count <= 0)
{delete StatPtr->RealPtr; delete StatPtr;
}
}
}
template <typename T>
T * Point <T>::operator->() const
{ if(StatPtr)
return StatPtr->RealPtr;
else return NULL;
}
template <typename T>
T & Point<T>::operator *() const
{ if(StatPtr) return *StatPtr->RealPtr;
else throw "Opps";
}
template <typename T>
Point<T> & Point<T>::operator =(const Point & p)
{ if(StatPtr)
{StatPtr->Count--;
if(StatPtr->Count <= 0)
{delete StatPtr->RealPtr; delete StatPtr;
}
}
StatPtr = p.StatPtr;
if(StatPtr) StatPtr->Count++; return * this;
}
struct Str
{ int a;
char c;
};
int main()
{ Point<Str> pt1(new Str); // генерация класса Point, конструирование
// объекта pt1, инициализируемого указателем
// на структуру Str, далее с объектом можно
// обращаться как с указателем
Point<Str> pt2=pt1,pt3; // для pt2 вызывается конструктор копирования,
// затем создается указатель pt3
pt3=pt1; // pt3 переназначается на объект указателя pt1
(*pt1).a=12; // operator*() получает this указатель на pt1
(*pt1).c='b';
int X=pt1->a; // operator->() получает this-указатель на pt1
char C=pt1->c;
return 0:
}
47.Свойства в С++.
В общем случае, свойство − это пара функций (public), одна из которых отвечает за установку компонент-данных (private) объекта, а другая за их считывание. Такое решение позволяет обеспечить инкапсуляцию данных. Необходимость использования свойств возникает тогда, когда при изменении некоторого параметра требуется произвести ещё некоторые действия.
Наиболее простой способ обеспечения инкапсуляции в C++ заключается в написании пары функций типа get_val() и put_val() для каждого параметра.
Модификатор _declspec получил дополнительный параметр «property». Это позволяет
в классе объявить «виртуальную» переменную и связать её с соответствующими
функциями.
class cls
{ int m;
public:
_declspec(property(get=get_val, put=put_val)) int V;
int get_val()
{ return m; }
void put_val(int v)
{ m = v; }
};
Мэин:
cls obj;
obj.V = 50; // при этом выполняется вызов put_val()
int k = obj.V; // при этом выполняется вызов get_val()
Основной недостаток:
Зависимость от компилятора. Нарушается инкапсуляция