- •Введение в перегрузку операций
- •Операции, как функции
- •Использование перегруженных операций
- •Ограничения в перегрузке операций
- •Перегрузка операций через дружественные функции
- •Перегрузка операций через дружественные функции
- •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 () {
Void operator [] (std::string index);
};
// Нет смысла перегружать операцию [] только для вывода чего-либо,
// но это самый простой способ показать, что параметр функции может быть не только целочисленным значением
Void Something::operator [] (std::string index){
std::cout << index;
}
Int main () {
Something something;
Something ["Hello, world!"];
return 0;
}
Результат выполнения программы:
Hello, world!
Перегрузка операции индексации обычно используется для обеспечения прямого доступа к элементам массива, который находится внутри класса (в качестве переменной-члена). Поскольку строки часто используются в реализации массивов символов, то оператор [] часто перегружают в классах со строками, чтобы иметь доступ к каждому символу строки отдельно.
Перегрузка операции ()
Все операции, перегрузку которых мы рассматривали до сих пор, позволяли нам самостоятельно определять тип параметров в функции перегрузки операции, но не их количество.
Например, операция == всегда принимает два параметра, тогда как операция (!) всегда принимает один параметр.
Операция () является особенно интересной, поскольку позволяет изменять как тип параметров, так и их количество.
Но следует помнить о двух вещах:
Во-первых, перегрузка круглых скобок должна осуществляться через метод класса!
Во-вторых, в не объектно-ориентированном C++ оператор () является оператором вызова функции.
В случае с классами перегрузка круглых скобок выполняется в методе operator() () {} (в объявлении функции перегрузки находятся две пары круглых скобок).
Рассмотрим следующий класс:
class Matrix {
private:
double data [5][5];
public:
Matrix () {
// Присваиваем всем элементам массива значение 0.0
for (int row=0; row < 5; ++row)
for (int col=0; col < 5; ++col)
data[row][col] = 0.0;
}
};
Матрицы являются ключевой концепцией в линейной алгебре и часто используются в геометрическом моделировании и в 3D-графике.
Всё, что вам нужно знать сейчас — это то, что класс Matrix является двумерным массивом (5×5 типа double).
На уроке о перегрузке операции индексации мы использовали операцию [] для прямого доступа к элементам закрытого одномерного массива.
Здесь же нам нужен доступ к элементам двумерного массива.
Поскольку операция [] ограничена лишь одним параметром, то её функциональности недостаточно для доступа к двумерному массиву.
Однако, поскольку оператор () может принимать разное количество параметров, мы можем объявить версию operator(), которая будет принимать два целочисленных параметра (два индекса), и использовать эти индексы для доступа к элементам нашего двумерного массива. Например:
#include <iostream>
#include <cassert> // для assert ()
class Matrix {
private:
double data [5][5];
public:
Matrix () {
// Присваиваем всем элементам массива значение 0.0
for (int row=0; row < 5; ++row)
for (int col=0; col < 5; ++col)
data[row][col] = 0.0;
}
double& operator () (int row, int col);
const double& operator () (int row, int col) const; // для константных //объектов
};
double& Matrix:operator () (int row, int col) {
assert (col >= 0 && col < 5);
assert (row >= 0 && row < 5);
return data[row][col];
}
const double& Matrix::operator()(int row, int col) const {
assert(col >= 0 && col < 5);
assert(row >= 0 && row < 5);
return data[row][col];
}
