Лабораторное занятие №3. Друзья класса. Перегрузка методов. Статические элементы
Друзья
Спецификаторы доступа класса позволяют указывать, могут ли функции
вне определённого вами класса обращаться к его элементам. Однако, случается,
что вам требуется обеспечить определённой функции или классу доступ к
элементам вашего класса, специфицированным как private или protected. Язык
С++ позволяет вам особо разрешить доступ к любым элементам класса другому
классу или функции с помощью ключевого слова friend
Внимание! Не злоупотребляйте объявлениями дружественных классов и
функций. Снимая запрет на доступ к защищённым данным, вы идёте на
нарушение принципа инкапсуляции, превращая класс, по своим свойствам,
ближе к структуре языка С. Старайтесь использовать дружественные
функции только при переопределении операторов класса.
Дружественные классы
Обеспечить доступ одного класса (ClassB) к элементам, объявленным как
private и protected в другом классе (ClassA), можно посредством конструкции в
классе ClassA:
Пример №1. Объявление дружественного класса.
class ClassA
{
friend class ClassB;
};
Дружественные функции
Вы можете разрешить обычной функции или функции-элементу другого класса
полный доступ к элементам класса, объявленным как private или protected.
16 Объектно-ориентированное программирование на С++.
Правила относительно друзей
• На описания friend не влияют спецификаторы доступа.
• Описания friend не взаимны: если А объявляет В другом, то это не означает,
что А является другом В.
• Дружественность не наследуется.
• Дружественность не является переходным свойством.
Задание №1
Объявите дружественным классом для класса «Треугольник», разработанного
на практическом занятии №2, класс «Точка». Модифицируйте доступ к
элементам класса «Точка» со стороны класса «Прямоугольник». (Подсказка:
используйте прямой доступ к элементам класса «Точка», вместо
использования методов)
Перегрузка операторов
Язык С++ позволяет определять и применять к классу обозначения операций;
на прошлом практическом занятии мы уже рассмотрели операцию
присваивания (operator=) и операцию приведения типа (operator новый_тип()).
Эта возможность (перегрузка операторов) даёт вашему класс возможность
вести себя подобно встроенному типу данных. Можно перегружать следующие
операции:
Таблица 2
Правила перегрузки
• Приоритеты операций и правила ассоциации, принятые для встроенных
типов данных, остаются неизменными при оценке выражений с
перегруженными функциями-операциями.
• Функция-операция не может изменить поведение операции по отношению к
встроенным типам данных.
• Функция-операция должна быть либо элементом класса, либо воспринимать
один или несколько аргументов, имеющих тип класса.
• Функция-операция не может иметь аргументов по умолчанию.
• За исключением operator=(), функции-операции не наследуются.
Пример №3. Определение некоторых операторов для класса «Точка»
class Point
{
private:
int x; int y;
public:
Point& operator+(const Point& p) // Переопределение оператора +
{
x+=p.x;
y+=p.y;
return *this;
}
// Операция <<. Выводит координаты точки в I/O поток в виде x:y
friend ostream& operator << (ostream& os, const Point& p);
};
18 Объектно-ориентированное программирование на С++.
Задание №2
Переопределите в классе «Треугольник», определённом на практическом
занятии №2 следующие операции:
• Операцию «-», вычитающую вершины одного треугольника из другого (см.
пример №3).
• Операцию «+», складывающую координаты вершин треугольников.
• Операцию «[]» для получения доступа к вершинам треугольника, как к
массиву (подсказка: определите оператор Point& operator [] (int Index) ).
• Операцию «<<» для вывода координат всех вершин треугольника в I/0
поток.
• Операцию «==» для сравнения треугольников по координатам вершин.
• Операцию «>» для сравнения треугольников по площадям.
Статические элементы
Можно определить элемент данных или элемент-функцию класса как static.
Статический элемент класса может рассматриваться как глобальная переменная
или функция, доступная только в пределах области класса.
Статические элементы данных
Элемент данных, определённый как static, разделяется всеми представителями
данного класса: существует только один экземпляр переменной, независимо от
числа созданных представителей (объектов) класса.
Статические методы класса
Статические элементы класса не ассоциируются с отдельным представителем
класса. Таким образом, им не передаётся указатель this. Из этого следует, что:
• Статическая функция-элемент может вызываться независимо от того, создан
или нет экземпляр класса.
• Статическая функция-элемент может обращаться только к статическим
элементам данных класса и вызвать только другие статические методы
класса.
• Статический метод не может быть объявлен как virtual.
19 Объектно-ориентированное программирование на С++.
Пример №4. Объявление статической переменной и статической
функции класса
class ClassA
{
static int m_Count;
public:
static int GetCount(void)
{
return m_Count;
}
};
// Обязательно инициализируйте статическую переменную
int ClassA::m_Count=0;
Хотя для доступа к статическим элементам можно использовать
конструкции
представитель_класа.элемент
или
представитель_класса->элемент
предпочтительнее использовать конструкцию
имя_класса::элемент
Задание №3.
В классе «Треугольник» определите статическую переменную и метод
(доступа к переменной) подсчёта созданных представителей класса.
Контрольные вопросы
1. К каким последствиям может привести использование конструктора
копирования, генерируемого компилятором по умолчанию?
2. Каким образом можно предотвратить в программе использование
конструктора копии?
3. Обратите внимание, что оператор присваивания в примере №3 возвращает
ссылку на сам класс (посредством return *this). Объясните назначение этой
операции.
4. В каких случаях компилятор вызывает конструктор копии, а в каких
операцию присваивания?
20 Объектно-ориентированное программирование на С++.
5. Объясните, чем предпочтительней использовать константные ссылки в
конструкторах копии и операциях присваивания?
6. Почему операция (процедура) преобразования не имеет явной спецификации
типа возвращаемого значения?
Задачи для самостоятельной подготовки
1. Определите класс histogram (гистограмма), в котором ведется подсчет чисел
в определенных интервалах, которые задаются как параметры конструктора
histogram. Обеспечьте функцию вывода гистограммы на печать. Сделайте
обработку значений, выходящих за границы.
2. Определите несколько классов, предоставляющих случайные числа с
определенными распределениями. Каждый класс имеет конструктор,
задающий параметры распределения, и функцию draw, которая возвращает
"следующее" значение.
3. Определите класс INT, который ведет себя в точности как int.
Опубликовал Kest
February 24 2014 17:26:39 ·
0 Комментариев ·
5153 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.