Слайд 1Лекция №3 по дисциплине
«Объектно-ориентированное программирование» на тему:
Константные объекты и функции.
Дружественные функции и классы
Слайд 2Доступ к элементам класса
Ключевые слова public и private называются
спецификаторами доступа к элементам класса.
Инкапсуляция в ООП – это сокрытие
деталей реализации класса.
Инкапсуляция - возможность изолирования данных и функций от остальной части программы.
Внутренний механизм класса получается защищенным
Данные обычно скрыты, а функции открыты
Слайд 3Интерфейс и реализация класса
Объявление класса называют интерфейсом класса, а
определения членов-функций – его реализацией
Члены-данные класса и члены-функции принадлежат
к области действия класса. Внутри области действия класса элементы класса допускают обращение просто по имени. Вне области действия класса на элементы класса можно ссылаться через имя объекта, ссылку или указатель на объект
Слайд 4Область действия функции
Переменные, объявленные в члене-функции, имеют область действия функции
– они известны только в этой функции.
Если в члене-функции
определена переменная с тем же именем, что и переменная с областью действия класса, то последняя будет скрыта первой внутри области действия функции.
Доступ к скрытой переменной можно получить при помощи операции разрешения области действия ::
Слайд 5Пример доступа к элементам класса
int main(){
Time t;
Time
*tptr=&t; // указатель на объект t.
Time &tref=t; // ссылка
на объект t
t.day=12;
t.print();
tref.day=17;
tref.print();
tptr->day=25;
tptr->print();
return 0;
}
Слайд 6Отделение интерфейса от реализации
Отделение интерфейса класса от реализации – основополагающий
принцип ООП.
Объявление класса нужно помещать в заголовочный файл. Клиент, желающий
использовать этот класс, должен включать этот файл директивой include. Это – интерфейс класса
Определения членов-функций нужно помещать в отдельный исходный файл с тем же именем, что и заголовочный файл. Это – реализация класса.
Слайд 7Константные объекты и функции
Константный объект – это объект, не
модифицируемый в программе
const Time t (23, 02, 2011);
Вызов членов-функций
от константных объектов разрешается, только если сама функция является константной
Объявление константной функции:
int Time::getDay() const {return day};
Определение с модификатором const члена-функции, которая изменяет элемент данных объекта, дает синтаксическую ошибку
константная функция может быть перегружена не-константной функцией
Слайд 8Пример с константными объектами и функциями
#include
using std::cout;
class Time{
private:
int day, month, year;
public:
Time(int=0, int=0, int=0);
void setTime(int, int, int);
void setDay(int);
int getDay() const;
void print();
};
Слайд 9Продолжение примера
Time:: Time(int d, int m, int y)
{
setTime(d, m, y);
}
void Time:: setTime(int d, int m, int y)
{
setDay(d);
month= (m>=1 && m<13) ? m : 0;
year= (y>=1900 && y<=2011) ? y : 0;
}
void Time::setDay(int d){
day= (d>=1 && d<32) ? d : 0; }
int Time::getDay() const {return day;}
void Time:: print()
{
cout<}
Слайд 10Тестирующая функция
int main(){
Time t1(23,02,2011);
const Time
t2(08,03,2011);
t1.setDay(7);
t2.setDay(12);
int n=t1.getDay();
int m=t2.getDay();
return 0;
}
Слайд 11Вложенные классы
Вложенный класс - это класс, включающий в качестве
элементов объекты других классов
Пример:
class Clock {
private:
char* name;
Time t;
…
};
Пример конструктора
класса Clock.
Clock::Clock( char *n, int d, int m, int y):
Time(d,m,y)
{…}
Слайд 12Дружественные структуры
Разновидности:
дружественные функции;
дружественные классы;
дружественные члены-функции.
Дружественные функции имеют доступ ко
всем элементам класса, в том числе закрытым, но сами членами
класса не являются
Слайд 13Пример дружественной функции
#include
class Time{
private:
int day,
month, year;
public:
Time() {day=1; month=1; year=1970;}
void print() const {
cout<
friend bool w_year(Time &); // функция проверяет, //является ли год високосным
};
Слайд 14Окончание примера
bool w_year(Time &t){
return !(t.year%4);
}
int main() {
Time t1;
bool w=w_year(t1);
cout
Слайд 15Пример функции, дружественной двум классам
class B;
class A {
friend
void f (A, B);
};
class B {
friend void f
(A, B);
};
void f(A a, B b) { }
Слайд 16Перегруженные функции можно также объявлять дружественными
Чтобы объявить дружественным целый
класс, нужно внутри описания класса ClassOne поместить объявление
friend class ClassTwo;
Понятие дружественности не симметрично.