Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 5-6_n — копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
144.59 Кб
Скачать

Int main () {

Point point1(3.0, 4.7, 5.0);

Point point2(9.0, 10.5, 11.0);

std::cout << point1 << " " << point2 << '\n';

return 0;

}

Результат выполнения программы:

Point (3, 4.7, 5) Point (9, 10.5, 11)

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

Также можно перегрузить и операцию ввода. Всё почти так же, как и с операцией вывода, но главное, что нужно помнить — std::cin является объектом типа std::istream.

Вот наш класс Point с перегруженным оператором ввода >>:

#include <iostream>

class Point {

private:

double m_x, m_y, m_z;

public:

Point (double x=0.0, double y=0.0, double z=0.0): m_x(x), m_y(y), m_z(z) {}

friend std::ostream& operator<< (std::ostream &out, const Point &point);

friend std::istream& operator>> (std::istream &in, Point &point);

};

std::ostream& operator<< (std::ostream &out, const Point &point)

{ // Поскольку operator<< является другом класса Point, то мы имеем //прямой доступ к членам Point

out << "Point (" << point.m_x << ", " << point.m_y << ", " << point.m_z << ")";

return out;

}

std::istream& operator>> (std::istream &in, Point &point)

{ // Поскольку operator>> является другом класса Point, то мы имеем //прямой доступ к членам Point.

// Обратите внимание, параметр point (объект класса Point) должен //быть не константным, чтобы мы имели возможность изменить //члены класса

in >> point.m_x;

in >> point.m_y;

in >> point.m_z;

return in;

}

Вот пример программы с использованием как перегруженного оператора <<, так и оператора>>:

Int main () {

std::cout << "Enter a point: \n";

Point point;

std::cin >> point;

std::cout << "You entered: " << point << '\n';

return 0;

}

Предположим, что пользователь введет 4.0, 5.5 и 8.37, тогда результат выполнения программы:

You entered: Point (4, 5.5, 8.37)

Перегрузка операций << и >> намного упрощает процесс вывода класса на экран и получение пользовательского ввода с записью в класс.

Тест

Используя класс Fraction, представленный ниже, добавьте перегрузку операторов << и >>.

Следующий фрагмент кода:

Int main () {

Fraction f1;

std::cout << "Enter fraction 1: ";

std::cin >> f1;

Fraction f2;

std::cout << "Enter fraction 2: ";

std::cin >> f2;

std::cout << f1 << " * " << f2 << " is " << f1 * f2 << '\n';

return 0;

}

Должен выдавать следующий результат:

Enter fraction 1: 3/4

Enter fraction 2: 4/9

3/4 * 4/9 is 1/3

Вот класс Fraction:

#include <iostream>

class Fraction {

private:

Int m_numerator;

Int m_denominator;

public:

Fraction (int numerator=0, int denominator=1):

m_numerator(numerator), m_denominator(denominator)

{// Мы поместили метод reduce () в конструктор, чтобы //убедиться, что все дроби, которые у нас есть, будут уменьшены!

// Все дроби, которые перезаписаны, должны быть повторно //уменьшены

reduce ();

}

// Делаем функцию nod () статической, чтобы она могла быть //частью класса Fraction и при этом, для её использования, нам не //требовалось бы создавать объект класса Fraction

static int nod (int a, int b) {

return b == 0 ? a : nod(b, a % b);

}