- •Введение в перегрузку операций
- •Операции, как функции
- •Использование перегруженных операций
- •Ограничения в перегрузке операций
- •Перегрузка операций через дружественные функции
- •Перегрузка операций через дружественные функции
- •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 () {
Перегрузка операций через дружественные функции
Мы рассмотрим перегрузку операций через дружественные функции, через обычные функции, а затем — через методы класса.
Арифметические операции плюс (+), минус (-), умножение (*) и деление (/) являются одними из наиболее используемых операций в языке C++. Все они являются бинарными, то есть работают только с двумя операндами.
Есть три разных способа перегрузки операций:
через дружественные функции;
через обычные функции;
через методы класса.
Перегрузка операций через дружественные функции
Используя следующий класс:
class Dollars {
private:
int m_dollars;
public:
Dollars (int dollars) {m_dollars = dollars;}
int getDollars () const {return m_dollars;}
};
Перегрузим операцию плюс (+) для выполнения операции сложения двух объектов класса Dollars:
#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;
}
Результат выполнения программы:
I have 16 dollars.
Здесь мы:
- объявили дружественную функцию operator+ ();
- задали в качестве параметров два операнда, с которыми хотим работать — два объекта класса Dollars;
- указали соответствующий тип возврата — Dollars;
- записали реализацию операции сложения.
Для выполнения операции сложения двух объектов класса Dollars нам нужно добавить к переменной-члену m_dollars первого объекта m_dollars второго объекта.
Поскольку наша перегруженная функция operator+() является дружественной классу Dollars, то мы можем напрямую обращаться к закрытому члену m_dollars .
Кроме того, поскольку m_dollars является целочисленным значением, а C++ знает, как складывать целочисленные значения, то компилятор будет использовать встроенную версию operator+() для работы с типом int, поэтому мы можем просто указать операцию + в нашей операции сложения двух объектов класса Dollars.
Перегрузка операции минус (−) аналогична:
#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);
// Выполняем Dollars - Dollars через дружественную функцию
friend Dollars operator-(const Dollars &d1, const Dollars &d2);
