Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП на языке С++.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

6.5. Манипуляторы

Несмотря на гибкость и большие возможности управления форматами с помощью компонентных функций класса ios, их применение достаточно громоздко. Более простой способ изменения параметров и флагов форматирования обеспечивают манипуляторы.

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

Для обеспечения работы с манипуляторами в классах istream и ostream имеются следующие перегруженные функции operator.

istream& operator>>(istream&(*_f)( istream&));

ostream& operator<<(ostream&(*_f)(ostream&));

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

Приведем список встроенных манипуляторов:

dec – устанавливает десятичную систему счисления;

hex – шестнадцатеричную;

oct – восьмеричную;

endl – вставляет в поток вывода символ новой строки и затем сбрасывает поток;

ends – вставляет ‘\’ в поток вывода;

flush – сбрасывает поток вывода;

ws – выбирает из потока ввода пробельные символы, поток будет читаться до появления символа, отличного от пробельного;

setbase(int) – устанавливает основание системы счисления ;

resetiosflags(long f) – сбрасывает флаги форматирования, для которых в f установлен бит в 1;

setiosflags(long f) – устанавливает те флаги форматирования, для которых в f соответствующие биты установлены в 1;

setfill(int c) – устанавливает символ-заполнитель (с – код символа-заполнителя);

setprecision(int n) – устанавливает точность при выводе вещественных чисел;

setw(int n) – устанавливает минимальную ширину поля вывода.

6.6. Ввод-вывод объектов пользовательских классов

Чтобы использовать операции >> и << с данными типов, определяемых пользователем, необходимо расширить действие этих операций, введя новые операции-функции. Первым параметром операции-функции должна быть ссылка на объект потокового типа, вторым – ссылка или объект пользовательского типа.

Пример 6.6.1

#include <iostream.h>

//Точка в трехмерном пространстве

class Point{

float x,y,z;

public:

Point(float i,float j,float k):x(i),y(j),z(k){};

friend ostreeam operator<<(ostream& stream,Point& p);

friend istreeam operator>>(istream& stream,Point& p);

};

ostream& operator<<(ostream& stream,Point& p)

{

return stream<<”\nx=”<<p.x<<” y=”<<p.y<<” z=”<<p.z<<endl;

}

istream& operator>>(istream& stream,Point& p)

{cout<<”\nx=”; stream>>p.x;

cout<<”y=”; stream>>p.y;

cout<<”z=”; stream>>p.z;

return stream;

}

При перегрузке операторов ввода-вывода для пользовательских типов можно предусмотреть определенный контроль, например, читать только некоторые символы из потока и пропускать все остальные. Это позволит вводить данные в более гибком формате. Например, для класса Point приемлемы следующие входные потоки:

10 20 30

(10, 20, 30)

(10

20

30)

Пример 6.6.2.

#include<ctype.h>

#include <iostream.h>

#include<process.h>

#include<windows.h>

//Точка в трехмерном пространстве

class Point{

float x,y,z;

public:

Point(float i,float j,float k):x(i),y(j),z(k){}

friend ostream& operator<<(ostream& os,Point& p);

friend istream& operator>>(istream& is,Point& p);

};

ostream& operator<<(ostream& os,Point& p)

{return os<<"\nx="<<p.x<<" y="<<p.y<<" z="<<p.z<<endl;}

// Функция помещает в входной поток только символы чисел

void SkipNoDigits(istream& is)

{char c;

for(;;)

{is>>c;

if(isdigit(c)||c==’-‘)

{

is.putback(c); //поместить символ в входной поток

return;}

}}

//Перегрузка операции ввода

istream& operator>>(istream& is,Point& p)

{SkipNoDigits(is);

is>>p.x;

SkipNoDigits(is);

is>>p.y;

SkipNoDigits(is);

is>>p.z;

return is;

}

void main()

{

SetConsoleOutputCP(1251);

Point a(1.1,2.2,3.3);

cout<<"Старые координаты"<<a;

cout<<"Введите новые координаты:";

cin>>a;

cout<<"Новые координаты"<<a;

system("pause");

}

Ниже показан пример выполнения программы