Автор: Пользователь скрыл имя, 08 Ноября 2011 в 12:07, шпаргалка
Работа содержит ответы на вопросы по дисциплине "Программирование".
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;
}
}
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->
}
struct Str
{ int a;
char c;
};
int main()
{ Point<Str> pt1(new Str); // генерация класса Point, конструирование
Point<Str> pt2=pt1,pt3; // для pt2 вызывается конструктор копирования,
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_
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()
Основной недостаток:
Зависимость от компилятора. Нарушается инкапсуляция