русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Создание операторов вставки


Дата добавления: 2013-12-23; просмотров: 1142; Нарушение авторских прав


В C++ имеется легкий способ определения оператора вставки для создаваемых классов. В следую­щем простом примере создается оператор вставки для ранее уже встречавшегося класса point:

class point

{

public:

int x, у, z;

point(int a, int b, int с) { x=a; y=b; z=c; }

}

Для того, чтобы определить оператор вставки для объекта класса point, необходимо перегрузить оператор << по отношению к этому классу. Один из способов показан ниже.

// вывод координат x, y, z (оператор вставки для point)

ostream& operator<<(ostream &stream, point &obj)

{

stream << obj.x << ", " << obj.y << ", " << obj.z << "\n";

return stream; // возврат потока

}

Многие особенности этой функции являются общими для всех функций вставки. Прежде всего, обратим внимание, что в качестве возвращаемого значения этой функции объявлен объект типа ostream. Это необходимо для того, чтобы один оператор мог содержать несколько операторов вставки. Далее, функция имеет два параметра. Первым служит ссылка на поток, который фигури­рует в левой части оператора <<. Вторым параметром служит объект с правой стороны операто­ра <<. В самой функции осуществляется вывод трех величин, содержащихся в объекте point, после чего возвращается поток stream. Следующая короткая программа служит для демонстра­ции оператора вставки:

int main()

{

point a(1, 2, 3), b(3, 4, 5), c(5, 6, 7);

cout << a << b << c;

return 0;

}

Общая форма функции вставки показана ниже:

ostream& operator<<(ostream &поток, тип_класса &объект)

{

// характерный для типа код

return stream; // возврат потока

}

Остается только определить конкретные действия, выполняемые таким оператором вставки. Об­ратим внимание на необходимость возвращать поток. Также общей практикой является передача параметра объект по ссылке, поскольку если объект является большим, то гораздо быстрее передать его адрес. Также это предотвращает вызов деструктора объекта когда функция вставки возвращает результат.



В программе перегруженная функция вставки не является членом класса point. Действительно, ни функция вставки, ни функция извлечения не могут быть членами клас­са. Причина заключается в том, что если функция-оператор является членом класса, то левым операндом, неявно передаваемым с использованием указателя this, служит объект того класса, который осуществляет вызов функции-оператора. И нет способа изменить такой порядок. Вместе с тем при перегрузке оператора вставки левым аргументом является поток, а правым аргументом — объект. Поэтому перегруженные операторы вставки не могут быть функциями-членами. Этот факт вызывает логичный вопрос: как перегруженный оператор вставки может получить доступ к частным членам класса? В предыдущей программе переменные x, y и z были публичны­ми, так что оператор вставки имел к ним доступ. Однако защита данных является одной из важ­нейших особенностей объектно-ориентированного программирования, и требовать, чтобы все данные были публичными, значит противоречить самому духу ООП. Тем не менее, данная проблема имеет решение: оператор вставки может быть другом класса. В качестве друга класса, для которого он определен, он имеет доступ к частным данным. Иллюстрация этого приводится в следующем примере:

#include <iostream.h>

class point

{

int x, y, z; // теперь частные

public:

point(int a, int b, int c) { x=a; y=b; z=c; }

friend ostream& operator<<(ostream &stream, point &obj);

};

ostream& operator<<(ostream &stream, point &obj)

{

stream << obj.x << ", " << obj.y << ", " << obj.z << "\n";

return stream; // возврат потока

}

int main()

{

point a(1, 2, 3), b(3, 4, 5), c(5, 6, 7);

cout << a << b << c;

return 0;

}

Обратим внимание, что переменные x, у и z являются в данном случае частными членами класса point, но тем не менее продолжают быть доступными непосредственно с помощью функции вставки. Объявление операторов вставки и извлечение друзьями классов, для которых они опре­делены, позволяет сохранить неприкосновенным принцип инкапсуляции объектно-ориентиро­ванного программирования.



<== предыдущая лекция | следующая лекция ==>
Создание собственных операторов вставки и извлечения | Использование манипуляторов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.