Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС информатика2.docx
Скачиваний:
15
Добавлен:
07.07.2019
Размер:
130.5 Кб
Скачать
  1. Объекты и функции. Ссылки на объекты. Перегрузка конструкторов. Конструктор копий.

Конструктор копий исп для создания новых объектов из уже существующих. Это означает, что, так же как для других конст-ов, новый объект еще не существует к моменту его вызова. Однако только конс-ру копий объект передается как аргумент по ссылке. Итак, синтаксис конс-ра копий прост. Кон-ор копий произвольного класса X выглядит так: Х(const X&) ; // кон-ор копий класса Х

Кон-ор копий - должен иметь имя, совпадающее с именем класса. Назначение кон-ра копий - дублирование объекта-аргумента для построения нового объекта. Работа кон-ра копий - создание ранее не существовавшего объекта из уже существующего, а передача по значению (без использования операции получения адреса) требует создания копии аргумента. Точнее: при передаче объекта по значению создается его копия, если это произойдет в кон-ре копий, то он будет вызывать сам себя, пока не исчерпает все ресурсы системы.

Для перегрузки встроенных операторов С++ можно использовать ключевое слово operator. Ему может быть присвоен ряд значений, зависящих от параметров. Таким образом оператору типа + можно присвоить дополнительные значения. Это облегчает написание программ и делает их более читабельными. vect oprator *(const vect &,const matix &)где * является двухместным оператором умножения. matix t; vect s,r; s=t*r; // s=mpy(r,t); Перегруженный оператор можно вызвать и исп-ием функциональной формы записи: s=operator*(t,r);

Хотя операторам и могут добавляться новые значения, но их приоритет остается прежним. Например, операция умножения имеет более высокий приоритет, чем сложение. Перегружены могут все операторы. Нельзя использовать аргументы по умолчанию. Доступны все арифметические, логические операторы, операторы сравнения, равенство, присвоение, операторы поразрядных операций, префиксные и постфиксные формы операторов приращения и декремента. могут быть перегружены операторы индексации “[]” и обращения к функции “()”. Также могут быть перегружены оператор указателя класса “->“ и оператор указателя на член “->*”. Возможна перегрузка new, delete. Класс может предоставлять особые привилегии определенным внешним фун-ям или фун-ям-членам другого класса. Эти фун-ии получили назв-ия дружественных. Если фун-ия или класс объявлены как дружественные данному классу, то такие фун-ии или функции-члены такого класса могут осуществлять непосредственный доступ ко всем полям класса, для которого они дружественны. Дружественные фун-ии и классы могут осуществлять прямой доступ к закрытым полям класса без исп-я фун-ий-членов этого класса. Ключевое слово friend - спецификатор фун-ии, который дает фун-ии-не члену класса доступ к скрытым членам класса. Он используется для того, чтобы выйти за строгие рамки типизации и сокрытия данных в С++. Одна из причин их исп-ния состоит в том, что некоторые фун-ии нуждаются в привилегированном доступе более, чем к одному классу. 2-ая причина - friend-ф-ия передает все параметры через список параметров, и значение каждого из них подчинено преобразованию, совместимому с назначением. Такие преобразования применяются к явно переданным аргументам-классам и поэтому особенно полезны в случаях перегрузки оператора. Объявление friend ф-ции должно появляться внутри объявления класса, которому она дружественна. Имени ф-ции предшествует ключевое слово friend, и ее объявление может находится как в public так и в private части класса, что не повлияет на значение. Ф-ция-член одного класса может быть friend-ф-ией другого класса. Это происходит тогда, когда ф-ция-член объявлена в friend классе с испол-ием оператора разрешения контекста для определения имени ф-ции дружественного класса. По фу-ному назначению операция присваивания очень похожа на конс-тор копий. Принципиальное отличие состоит в том, что кон-тор копий создает новый объект, а операция присваивания работает с уже созданными. Вызывающий объект является левым операндом, объект-аргумент - правым. Операция присваивания также имеет соответствующий синтаксис. Операция присваивания - ф-ция-член и одновременно двухместная операция. В работу вовлечены 2 объекта. 1-ый объект - вызывающий, доступный по указателю this, а второй - это аргумент. Операция присваивания исп-ет в качестве аргумента постоянную ссылку. Для произвольного класса X мы имеем следующий синтаксис операции присваивания: X& operator = ( const X&); // синтаксис операции присваивания для произвольного класса. Присваивание - операция, значит мы должны исполь-ть ключевое слово operator и соответствующий символ операции. C++ допускает последовательные присваивания, так что это свойство надо сохранить, то необходимо возвращать ссылку на объект; в противном случае цепочка прервется. Итак, оператор-ф-ция принимает постоянную ссылку, а возвращает ссылку на объект. Испол-ие ключевого слова const позволяет ф-ции работать как с постоянными объектами, так и с переменными.

  1. Библиотека классов ввода-вывода C++. Предопред-е потоки C++. Классы потоков C++. Перегрузка операторов ввода/вывода. Файловый ввод-вывод.

В С++ производится ввода вывод потока байтов. Поток - просто последовательность байтов. В операциях ввода байты пересылаются от устройства в ОП. При выводе байты пересылаются из ОП на устройства.

Библиотека потоков iostream представляет сотни возможностей для выполнения операций вода вывода. Интерфейс библиотеки разбит на несколько заголовочных файлов. Заголовочный файл <iostream.h> включает объекты cin , cout, которые соответствуют стандартному потоку ввода вывода.

Библиотека iostram содержит много классов для обработки широкого спектра операций ввода-вывода. Класс istream поддерживает операции по вводу потоков. Класс ostream поддерживает класс операций по выводу потоков. Класс iostream поддерживает оба типа операций. Перегрузка операций обеспечивает удобную запись операций ввода вывода. Операция сдвига влево (<<) перегружена для обозначения вывода в поток и называется операцией поместить в поток. Операция сдвига вправо (>>) перегружена для обозначения ввода потоков и называется операцией взять из потока.

Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл fstream.h.

Существует небольшое отличие между использованием предопределенных и файловых потоков. Файловый поток должен быть связан с файлом прежде, чем его можно будет использовать. С другой стороны, предопределенные потоки могут использоваться сразу после запуска программы, даже в конструкторах статических классов, которые выполняются даже раньше вызова функции main(). Можно позиционировать файловый поток в произвольную позицию в файле, в то время как для предопределенных потоков это обычно не имеет смысла.

Для создания файлового потока эти классы предусматривают следующие формы конструктора:

создать поток, открыть файл и связать поток с файлом:

ifstream(const char *name, ios::openmode mode = ios::in);

ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc);

fstream(const char * name, ios::openmode mode = ios::in | ios::out);

Чтобы открыть файл для ввода или вывода, можно использовать вторую форму нужного конструктора