Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

CCPP / CPP / Программирование на языке Си++. Модуль №4

.pdf
Скачиваний:
43
Добавлен:
23.03.2016
Размер:
351.99 Кб
Скачать

Программирование

на языке Си++

1

Модуль 4.

ПЕРЕГРУЗКА ОПЕРАЦИЙ

Методы преобразования. Классы потоков Си++ Операции замещения и вставки Ввод/вывод в файлы

2

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Расширение действия (перегрузка) операций (начало)

Расширение действия (перегрузка) — возможность распространения действия стандартных операций на операнды других, «нестандартных» типов. Перегрузка стандартных операций возможна только в том случае, если хотя бы один из операндов является объектом пользовательского класса

Определение перегруженной операции (иначе — операции-функции)

<тип результата> operator <знак операции>

 

 

([<спецификация формальных параметров>])

 

{

[<тело операции-функции>]

}

Описание перегруженной операции

<тип результата> operator <знак операции> ([<спецификация формальных параметров>]);

3

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Расширение действия (перегрузка) операций (продолжение)

Количество аргументов перегруженной операции зависит от местности операции. Для связи с классом операцияфункция должна быть компонентной функцией класса, дружественной по отношению к нему либо располагать хотя бы одним параметром типа «(ссылка на) класс»

Будучи компонентной, операция-функция принимает на 1 параметр меньше, чем предусмотрено ее местностью (бинарные операции требуют одного параметра, унарные не требуют параметров вообще). Компонентной не может быть функция, первый параметр которой имеет базовый тип

Будучи дружественной (или) глобальной, операция-

функция принимает столько фактических параметров, сколько предусмотрено ее местностью (бинарные операции

требуют 2 параметров, унарные — 1). Глобальными не могут быть функции operator =, operator [], operator ->.

4

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Расширение действия (перегрузка) операций (окончание)

Операции-функции допускают синтаксически равноправные сокращенную (выражение с операндами требуемых типов, строка 1) и полную (одну из двух в зависимости от порядка

определения, строки 2–3) формы вызова (показаны на примере бинарной операции +):

<операнд 1> + <операнд 2>

<операнд 1>.operator + (<операнд 2>) // для компонентных operator + (<операнд 1>, <операнд 2>)// для глобальных и

дружественных

Не допускается перегрузка несуществующих (новых), а также ряда стандартных операций языка Си++:

.

.*

?:

::

sizeof

#

##

Перегрузка операций сохраняет их местность и взаимный приоритет (ранг)

5

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Особенности перегрузки операций ++, --

Перегрузка префиксных вариантов операций ++ и -- не отличается от описанной ранее Перегрузка постфиксных вариантов операций ++ и

требует включения в заголовок (прототип) операции-

функции фиктивного (возможно, неименованного) формального параметра типа int, имеющего нулевое

значение и занимающего в заголовке (прототипе) функции последнее место, например:

<имя типа> operator ++ (int [<идентификатор>]) <имя типа> operator -- (int [<идентификатор>])

6

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Потоковый ввод-вывод в языке Си++. Общие положения

Реализован посредством популярной, но не являющейся частью стандарта на язык Си++ объектно-ориентированной библиотеки, включающей, среди прочих, заголовочные файлы <iostream.h> и <fstream.h>

Поток с позиций данной библиотеки — это имеющая или лишенная буфера обмена последовательность байтов, связанная с устройством, файлом или процессом в памяти. Среди потоков выделяют входные, выходные и двунаправленные. По типам обслуживаемых устройств потоки делятся на стандартные, консольные, файловые и строковые

Потоки как механизм ввода-вывода обеспечивают буферизацию сообщений, независимость от файловой системы конкретной ОС, контроль типов и удобный обмен данными произвольной структуры

7

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Важнейшие классы. Стандартные потоки ввода-вывода

Важнейшими классами библиотеки потокового ввода-вывода являются следующие:

ios — базовый класс потока;

istream — класс входного потока;

ostream — класс выходного потока;

ifstream — класс входного файлового потока;

ofstream — класс выходного файлового потока

При включении в текст программы библиотеки <iostream.h> к программе автоматически подключаются (и открываются для обмена) следующие потоки:

istream cin — стандартный буферизированный входной поток;

ostream cout—стандартный буферизированный выходной поток;

ostream cerr— стандартный небуферизированный выходной поток сообщений об ошибках;

ostream clog— стандартный буферизированный выходной поток сообщений об ошибках

8

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Операции обмена данными и манипуляторы в стандартных потоках

Извлечение данных — операция >> чтения данных из потока класса istream

Включение (вставка) данных — операция << записи данных в поток класса ostream

Пригодные для использования как правые операнды операций >> и << функции изменения состояния потоков

ввода-вывода данных носят название манипуляторов. К числу последних относятся:

– dec — при вводе-выводе устанавливает признак десятичной системы;

– hex — при вводе-выводе устанавливает признак шестнадцатеричной системы;

– endl — при выводе размещает в потоке (нулевой) признак конца строки и выгружает содержимое буфера;

ends — при выводе размещает в потоке признак конца строки;

flush — при выводе выгружает содержимое буфера

9

Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Потоковый ввод-вывод пользовательских типов

Типовая структура операции-функции включения (вставки) данных в поток ostream [Под03]

ostream &operator << ( ostream &<имя потока>,

<имя типа> <идентификатор>)

{

// операторы вида: out << ...; return out;

}

Типовая структура операции-функции извлечения данных из потока istream [Под03]

istream &operator >> ( istream &<имя потока>,

<имя типа> &<идентификатор>)

{

// операторы вида: in >> ...; return in;

}

10