Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Принадлежит ли точка пересечению двух окружностей на Turbo Pascal + Отче...
База данных студентов на Delphi (файл записей) + Блок схемы
Расчет обратной матрицы на Delphi + Пояснительная записка

Лабораторное занятие №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 February 24 2014 17:26:39 · 0 Комментариев · 4550 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Добавление басса ...
База Allsubmitter...
PrevInst
Редактор текста (...
Strawberry Prolog...
Размещение элемен...
Delphi и технолог...
Создание оригинал...
Midi
Карта сайта
Counter [Исходник...
Программирование ...
RSS Feeds
WebReg v1.3
Удаление своего EXE
PDJ_Anima
isoCanvas (Редакт...
Gold Submitter II...
Керниган Б.В., Ри...
Microsoft SQL Ser...

Топ загрузок
Приложение Клие... 100771
Delphi 7 Enterp... 97787
Converter AMR<-... 20259
GPSS World Stud... 17014
Borland C++Buil... 14186
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5968
Visual Studio 2... 5205
Microsoft SQL S... 3661
Случайные статьи
клиенты POP3/SMTP
• Открыть в службе...
Модуль XHTML Modul...
Вывод в текущее по...
Завершение установ...
5.2.1. Вывод литер
Квартир оценка
Настройка визуальн...
"]" or ".)" expected
Официальное Вулкан...
Интернет-соединени...
Архивирование оказ...
Создание и отправк...
Элемент ввода radi...
Оптимизации
Что позволяет сдел...
Алгоритм copy_if()
Проверка маршрутов...
";" expected
Выбор технологии
Настройка управлен...
Списки
Отсутствует прямой...
В перспективе VRML
Тестирование, поис...
Статистика



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


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