Программирование · 6 min read · Oct 12, 2025

Изучение C/C++ шаг за шагом - Страница 15

15. Шаг за шагом C/C++ — Программирование на C++ - Перегрузка операторов

Перегрузка операторов

| | 1. Введение

  1. Оператор
    • Правила перегрузки операторов
    • Ограничения на перегрузку операторов
  2. Перегрузка унарных операторов
  3. Перегрузка бинарных операторов
  4. Перегрузка операторов со строками |

1. Введение

| | // Присвоение переменной другой
#include
using namespace std;
int main()
{
int a = 10, b;
b = a; // допустимо
cout << b;
return 0;
} | // Присвоение объекта другому
#include
using namespace std;
class emp
{
public:
int eno;
float sal;
};
int main()
{
emp e1= { 1001, 2300.45 },e2 ;
cout << endl << e1.eno << e1.sal;
e2 = e1; // допустимо
cout << endl << e2.eno << e2.sal;
return 0;
} |

Выражения распространены в каждом языке; выражение - это совокупность операндов и операторов. В то время как операция - это совокупность выражений.
Вышеуказанные две программы демонстрируют, как переменные/объекты были присвоены вместе.

Обе программы допустимы, они демонстрируют использование оператора равенства ( = ).

| | | |

Перегрузка операторов - одна из самых захватывающих функций объектно-ориентированного программирования. Она используется для преодоления ситуации, подобной вышеуказанной недопустимой операции со структурой. Она может преобразовать сложные, неясные списки программ в интуитивно понятные.

С помощью перегрузки операторов мы можем увидеть, как обычные операторы C++ могут получить новые значения при применении к пользовательским типам данных. Ключевое слово operator используется для перегрузки оператора, и результирующий оператор будет принимать значение, предоставленное программистом.

Например, используя объект, мы можем выполнить прямую операцию присвоения строки.

| | // Программа для присвоения строки другой
#include
#include
#include
using namespace std;
class string
{
char str;
public:
string() { }
string(char
s) { str = s; }
void putstring()
{
cout << str;
}
};
int main()
{
string s1(“Компьютер“);
string s2;
s2 = s1;
s2.putstring();
return 0;
} |

2. Оператор

тип operator символ-оператора ( список-параметров )

Ключевое слово operator объявляет функцию, указывая, что символ-оператора означает, когда применяется к экземплярам класса. Это дает оператору более одного значения или “перегружает” его. Компилятор различает разные значения оператора, проверяя типы его операндов.

Правила перегрузки операторов

  • Вы можете перегружать следующие операторы:
+-*/%^
!=<>+=–=

| | ^= | &= | |= | << | >> | <<= | | | <= | >= | && | || | ++ | –– | | | ( ) | [ ] | new | delete | & | | | | | ~ | = | /= | %= | >>= | == | | | != | , | –> | –> | | |

  • Если оператор может использоваться как унарный, так и бинарный оператор, вы можете перегружать каждое использование отдельно.

  • Вы можете перегружать оператор, используя либо нестатическую член-функцию, либо глобальную функцию, которая является другом класса. Глобальная функция должна иметь хотя бы один параметр, который является типом класса или ссылкой на тип класса.

  • Если унарный оператор перегружен с использованием член-функции, он не принимает аргументов. Если он перегружен с использованием глобальной функции, он принимает один аргумент.

Если бинарный оператор перегружен с использованием член-функции, он принимает один аргумент. Если он перегружен с использованием глобальной функции, он принимает два аргумента.

Ограничения на перегрузку операторов

  • Вы не можете определять новые операторы, такие как **.

  • Вы не можете изменять приоритет или группировку оператора, а также не можете изменять количество операндов, которые он принимает.

  • Вы не можете переопределять значение оператора, когда он применяется к встроенным типам данных.

  • Перегруженные операторы не могут принимать аргументы по умолчанию.

  • Вы не можете перегружать никакой символ препроцессора, а также не можете перегружать следующие операторы:

| | . | .* | :: | ?: |

Оператор присвоения имеет некоторые дополнительные ограничения. Его можно перегружать только как нестатическую член-функцию, а не как функцию-друга. Это единственный оператор, который не может быть унаследован; производный класс не может использовать оператор присвоения базового класса.

3. Перегрузка унарных операторов

Давайте начнем с перегрузки унарного оператора. Унарные операторы действуют только на один операнд. (Операнд - это просто переменная, на которую действует оператор). Примеры унарных операторов - это операторы инкремента и декремента ++ и , а также унарный минус.

Пример:
Следующий пример демонстрирует использование оператора инкремента ++.

| | #include
using namespace std;
class counter
{
private:
unsigned int count;
public:
counter(){ count = 0; }
int get_count()  { return count; }
counter operator ++()
{
count++;
counter temp;
temp.count = count;
return temp;
}
};
int main()
{
counter c1, c2;                            // c1 = 0,  c2 = 0
cout << “\nC1 = “ << c1.get_count();       // вывод
cout << “\nC2 = “ << c2.get_count();

++c1; // c1 = 1
c2 = ++c1 ; // c1 = 2, c2 = 2

cout << “\nC1 = “ << c1.get_count();       // вывод снова
cout << “\nC2 = “ << c2++.get_count();     // c2 = 3
return 0;
} |

Еще один пример для перегрузки унарного минуса.

| | #include
using namespace std;
class subtract
{
int a;
int b;
public:
void getdata(int x, int y)
{
a = x; b = y;
}
void putdata()
{
cout<< endl << “A = “ << a <<”B = “ << b;
}
void operator -()
{
a = -a; b = -b;
}
};

int main()
{
subtract s;
s.getdata(34, -6);
cout << endl << “S : “;
s.putdata();
-s;
cout << endl << “S : “;
s.putdata();
return 0;
}
|

4. Перегрузка бинарных операторов

Но операторы могут быть перегружены так же легко, как и унарные операторы. Мы рассмотрим примеры, которые перегружают арифметические операторы, операторы сравнения и операторы арифметического присвоения.

Мы только что увидели, как перегружать унарный оператор. Тот же механизм может быть использован для перегрузки бинарного оператора.

| | // Перегрузка оператора +
#include
using namespace std;
class time
{
int hh; int mm; int ss;
public:
time( ) { }
time(int h, int m, int s)
{
hh =h; mm = m; ss = s;
}
void disp_time()
{
cout << endl << hh<< “ : “
<< mm << “ : “ << ss;
}
time operator+(time);
};

time time::operator+(time t)
{
time temp;
temp.hh = hh + t.hh;
temp.mm = mm + t.mm;
temp.ss = ss + t.ss;
return temp;
}

int main()
{
time t1(12,1,24) , t2(5, 23, 45), t3;
t3 = t1 + t2;
t3.disp_time();
return 0;
} |

5. Перегрузка операторов со строками

C/C++ обрабатывает строки совершенно иначе; мы никогда не копируем, не конкатенируем и не сравниваем строки, используя операторы, как в других языках. C/C++ имеет встроенные функции для выполнения вышеуказанных операций. Но C++ предоставляет возможность делать все со строками, используя операторы. Это означает, что мы должны предоставить дополнительную ответственность операторам для выполнения таких действий.

Следующий пример демонстрирует сравнение двух строк с использованием оператора сравнения ==.

| | // Программа для сравнения двух строк с использованием перегрузки операторов
#include
#include
#include
using namespace std;

enum boolean{ false, true };

class string
{
char str;
public:
string() {
str = NULL; }
string(char *s) { str = s; }
int operator ==(string ts)
{
if (strcmp(str, ts.str) >= 0)
return true;
else
return false;
}
};

int main()
{
string s1(“Компьютер“);
string s2(“Компьютеры”);

if(s1 == s2)
cout << “Равны”;
else
cout << “Не равны”;

return 0;
} |

| | // конкатенация двух строк
#include
#include
#include
using namespace std;

class string
{
char str;
public:
string()
{
str = new char[30] ;
str = NULL;
}
string(char *s) { str = s; }
string operator +(string ts)
{
string t;
strcat(t.str, str);
strcat(t.str, ts.str);
return t;
}
void putstring()
{
cout << endl << str;
}
};

int main()
{
string s1(“Компьютер“); string s2(“Институт”);
s1.putstring(); s2.putstring();
string s3;

s3 = s1 + s2;

s3.putstring();
return 0;
} |

Ссылка: Объектно-ориентированное программирование в Turbo C++: Роберт Лафор

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.