Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
21 ошибка прогр... 63946
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

Пользователей: 13,135
новичок: Kalqkwm
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование системы управления качеством производственного процесса на...
База данных электронного документооборота на Delphi + бд Intebase
Моделирование интернет кафе на GPSS + Отчет

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Лабораторное занятие №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
Лабораторное занятие №3. Друзья класса. Перегрузка методов.  Статические элементы
Правила перегрузки
• Приоритеты операций и правила ассоциации, принятые для встроенных
типов данных, остаются неизменными при оценке выражений с
перегруженными функциями-операциями.
• Функция-операция не может изменить поведение операции по отношению к
встроенным типам данных.
• Функция-операция должна быть либо элементом класса, либо воспринимать
один или несколько аргументов, имеющих тип класса.
• Функция-операция не может иметь аргументов по умолчанию.
• За исключением 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);
};

ostream& operator << (ostream& os, const Point& p)
{
os << p.x << ":"<< p.y << endl;
return os;
}




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 Февраль 24 2014 21:26:39 · 0 Комментариев · 3229 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Советы от Даниилы...
TDBF
Панель поиска
Dbgridpack
Черный круг двига...
KOL & MCK v1.69
Exe in exe
Plasma
VFW
Основы Delphi
TsHintManager
RxLIB
Java 2 - Эффектив...
Фундаментальные а...
PDJ_Anima
Web Регистрация
OnlineIP
Drag&Drop
Text3D
Керниган Б.В., Ри...

Топ загрузок
Приложение Клие... 100578
Delphi 7 Enterp... 93903
Converter AMR<-... 20130
GPSS World Stud... 16149
Borland C++Buil... 13496
Borland Delphi ... 9474
Turbo Pascal fo... 7154
Калькулятор [Ис... 5363
Visual Studio 2... 5060
FreeSMS v1.3.1 3581
Случайные статьи
«Умный» массив
Создание пользоват...
• Защита полезных ...
участвует агент SN...
капни, требуя две ...
Популярные игры в ...
Принципы работы ск...
Undefined external
";" expected
Логотип Матрикс
3. См. задачу 2. Р...
Прямые методы сорт...
Протокол передачи ...
Работаем вместе с ...
Как увидеть пробле...
Классы-оболочки вс...
Вычислить среднее ...
Настройки программ...
Документация
СПОСОБЫ РАСПОЗНАВА...
Округление по необ...
Фаза подтверждения
Что есть у большин...
Что часто является...
Процедуры и функци...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?