- •Введение в перегрузку операций
- •Операции, как функции
- •Использование перегруженных операций
- •Ограничения в перегрузке операций
- •Перегрузка операций через дружественные функции
- •Перегрузка операций через дружественные функции
- •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 () {
Fraction f1(1, 4);
f1.print ();
Fraction f2(1, 2);
f2.print ();
}
Должен выдавать следующий результат:
1/4
1/2
b) Добавьте перегрузку оператора умножения (*) для выполнения операции умножения объекта класса Fraction на целочисленное значение и для перемножения двух объектов класса Fraction. Используйте способ перегрузки оператора через дружественную функцию.
Подсказка: Умножение двух дробей осуществляется умножением двух числителей, а затем отдельно двух знаменателей. Для выполнения операции умножения объекта на целочисленное значение, умножьте только числитель на целочисленное значение (знаменатель не трогайте).
Следующий фрагмент кода:
#include <iostream>
Int main () {
Fraction f1(3, 4);
f1.print ();
Fraction f2(2, 7);
f2.print ();
Fraction f3 = f1 * f2;
f3.print ();
Fraction f4 = f1 * 3;
f4.print ();
Fraction f5 = 3 * f2;
f5.print ();
Fraction f6 = Fraction (1, 2) * Fraction (2, 3) * Fraction (3, 4);
f6.print ();
}
Должен выдавать следующий результат:
3/4
2/7
6/28
9/4
6/7
6/24
Дополнительное задание
c) Дробь 2/4 — это та же дробь, что и 1/2, только 1/2 не делится до минимальных неделимых значений.
Мы можем уменьшить любую заданную дробь до наименьших значений, найдя наибольший общий делитель (НОД) для числителя и знаменателя, а затем выполнить деление как числителя, так и знаменателя на НОД.
Ниже приведена функция поиска НОД:
int nod (int a, int b) {
return (b == 0)? (a > 0? a : -a) : nod(b, a % b);
Добавьте эту функцию в ваш класс и реализуйте метод reduce(), который будет уменьшать дробь. Убедитесь, что дробь будет максимально и корректно уменьшена.
Следующий фрагмент кода:
#include <iostream>
Int main () {
Fraction f1(3, 4);
f1.print ();
Fraction f2(2, 7);
f2.print ();
Fraction f3 = f1 * f2;
f3.print ();
Fraction f4 = f1 * 3;
f4.print ();
Fraction f5 = 3 * f2;
f5.print ();
Fraction f6 = Fraction (1, 2) * Fraction (2, 3) * Fraction (3, 4);
f6.print ();
return 0;
}
Должен выдавать следующий результат:
3/4
2/7
3/14
9/4
6/7
1/4
Перегрузка операций через обычные функции
Мы перегружали операции через дружественные функции operator+ ():
#include <iostream>
class Dollars {
private:
Int m_dollars;
public:
Dollars (int dollars) {m_dollars = dollars;}
// Выполняем Dollars + Dollars через дружественную функцию
friend Dollars operator+(const Dollars &d1, const Dollars &d2);
Int getDollars () const {return m_dollars;}
};
// Примечание: Эта функция не является методом класса!
Dollars operator+(const Dollars &d1, const Dollars &d2) {
// Используем конструктор Dollars и operator+(int, int).
// Мы имеем доступ к закрытому члену m_dollars, так как эта //функция является дружественной классу Dollars
return Dollars (d1.m_dollars + d2.m_dollars);
}
Int main () {
Dollars dollars1(7);
Dollars dollars2(9);
Dollars dollarsSum = dollars1 + dollars2;
std::cout << "I have " << dollarsSum.getDollars() << " dollars." << std::endl;
return 0;
}
Использование дружественной функции для перегрузки операций удобно тем, что мы имеем прямой доступ ко всем членам класса, с которым работаем.
В примере, приведенном выше, наша дружественная функция перегрузки операции + имеет прямой доступ к закрытому члену m_dollars класса Dollars.
Однако, если нам не нужен доступ к членам определенного класса, мы можем перегрузить операцию и через обычную функцию.
Так в классе Dollars присутствует геттер getDollars (), с помощью которого мы можем получить доступ к m_dollars извне класса.
Перепишем перегрузку оператора + через обычную функцию:
#include <iostream>
class Dollars{
private:
