- •Введение в перегрузку операций
- •Операции, как функции
- •Использование перегруженных операций
- •Ограничения в перегрузке операций
- •Перегрузка операций через дружественные функции
- •Перегрузка операций через дружественные функции
- •Int main () {
- •I have 16 dollars.
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Дружественные функции могут быть определены внутри класса
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Перегрузка операций с операндами разных типов
- •Int m_dollars;
- •Int getDollars () {return m_dollars;}
- •Int main () {
- •Values (int min, int max) {
- •Int getMin () {return m_min;}
- •Int getMax () {return m_max;}
- •Int main () {
- •Int main () {
- •Int main () {
- •Перегрузка операций через обычные функции
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Перегрузка операций ввода и вывода
- •Void print () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int m_numerator;
- •Int m_denominator;
- •Void reduce () {
- •Void print () {
- •Перегрузка операций через методы классов
- •Int m_dollars;
- •Int getDollars () { return m_dollars; }
- •Int main () {
- •Int m_dollars;
- •Int getDollars () {return m_dollars;}
- •Int main (){
- •Не всё может быть перегружено через дружественные функции
- •Не всё может быть перегружено через методы класса
- •Int main (){
- •Какой способ перегрузки и когда следует использовать?
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •If (!isHappy)
- •Int main () {
- •If (!something)
- •Перегрузка операций сравнения
- •Int main () {
- •Int m_dollars;
- •Int main () {
- •Перегрузка операторов инкремента и декремента
- •Int m_number;
- •Int main () {
- •Перегрузка операций инкремента и декремента версии постфикс
- •Int m_number;
- •Int main () {
- •Перегрузка операции индексации []
- •Почему оператор индексации [] использует возврат по ссылке?
- •Использование оператора индексации с константными объектами класса
- •Int& operator[] (const int index);
- •Int main (){
- •IntArray array;
- •Проверка ошибок
- •Int m_array[10];
- •Int& operator [] (const int index);
- •Int& IntArray::operator[] (const int index) {
- •Указатели на объекты и перегруженный оператор []
- •Передаваемый аргумент не обязательно должен быть целым числом
- •Void operator [] (std::string index);
- •Void Something::operator [] (std::string index){
- •Int main () {
- •Перегрузка операции ()
- •Int main () {
- •Void operator() ();
- •Void Matrix::operator()() {
- •Int main() {
- •Перегрузка операций преобразования типов данных
- •Int m_dollars;
- •Int getDollars () { return m_dollars; }
- •Int main () {
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);
}
