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

Оціни цю статтю





перевантаження операторів c ++, перевантаження операторів з ++, перевантаження операцій з ++, перевантаження операцій c ++

Перегрузка операторов в какой-то степени творческий процесс. С её помощью, у программистов появляется возможность облегчить для себя написание кода, а для других – повысить читабельность. Наприклад, когда какое-то действие приходится повторять в коде много раз, и просто мучительно постоянно использовать для этого специальные функции – можно перегрузить оператор для этого. Допустим, в коді треба часто об'єднувати рядки (дописувати рядки в рядок елемент класу). Это можно оформить по-разному. Но мы сделаем так, чтобы объединение строк происходило тогда, коли ми використовуємо оператор + :

Результатом цього має стати зміна елемента str. Он вместит в себе обе строки: “Название нашего сайта PureCodeCpp”.

Пока мы явно не перегрузим оператор +, компилятор будет “ругаться”, так как мы складываем не числа, а рядки. Але зараз ми навчимося вказувати йому, как надо действовать, когда мы просим выполнить нестандартное действие, используя +.

Приступаем к практике. Определим в примере 4 строки. Далее соберем из них анекдот, объединив их в правильном порядке в одну строку.

Не будем говорить об очевидном – перейдем к разбору самой перегрузки. В рядку 15 ми бачимо прототип методу класу Overload: void operator +(char*); Метод цей змусить працювати оператор + так, как мы того захотим (так как мы определим ниже). Щоб перевантажити будь-якої оператор потрібно використовувати ключове слово operator. В нашем случае, метод не повертає значень тому void, далі ключове слово operator и сам оператор +. Приймає цей метод покажчик на рядок.

У рядках 20 – 23 располагается определение метода перегрузки оператора. (Как определить метод вне класса читайте в статье Классы в С ) В нем, використовуючи функцію strcat_s(str, s); производится запись строки s в кінець рядка str (елемент класу). Действует это так – как только в коде встретится оператор + за которым будет располагаться строка – буде викликаний метод перевантаження оператора і цей рядок передасться в нього за вказівником.

В главной функции у нас определены в случайном порядке 4 строки. Отображаем их на экране (строки 39 – 42). Ниже, в строке 44, объявлен объект Joke. Під час його створення, конструктор класса, очистить елемент класу str от “сміття” и он будет готов для записи строк. Осталось выполнить простые действия (строки 46 – 49) – используя перегруженный + записать все строки в одну (str) в правильном порядке.

Результат:

перевантаження операторів c ++,  перевантаження операцій c ++

Все получилось. Ще, как видно в результате, для числовых данных оператор + сработал правильно. Поэтому можно спокойно применять его для арифметических операций в коде – компилятор вас “поймет”. Еще один момент – перегрузка оператора действует только в пределах того класса, для которого она определена. Если мы определим еще один класс (Overload2 например) але не перевантажимо для нього оператор, то попытка использовать + для записи строки куда-либо приведет к ошибке.




Есть ряд исключений в С – не всі оператори можна перевантажити. Ось перелік:

перевантаження операторів c ++,  перевантаження операцій c ++

И еще немного теории:

– перегрузка операторов не может изменить приоритет и порядок выполнения операций;

– нет возможности, с помощью перегрузки, создать новые символы для операций;

– бинарные операторы не могут быть использованы для переопределения унарной операции и наоборот – унарный оператор не переопределит бинарную операцию.

Перегрузка операторов, звичайно, “вещь” интересная. Только не стоит увлекаться. Используйте её только по мере острой необходимости – если это действительно будет приносить больше удобства, економити вам час і позитивно позначиться на читабельності коду. Старайтесь перегружать операторы так, щоб це було якомога ближче до їх логічного значення. То есть не надо складывать строки, перегружая оператор , например. Логичнее использовать +. Отмечу, что многие программисты не очень любят перегрузку операторов, так як деякі надмірно ній захоплюються і читати код стає складно. Так что внимательно взвешивайте все за и против, принимая решение о перегрузке операторов.

Я планирую в будущем написать еще одну статью о перегрузке операторов, де на прикладах хочу показати як перевантажити ++ инкремент, декремент, == равенство, = присвоювання new і delete. Хоч би не забути :)

Есть видео по теме. Автор MyNekis.

Щоб підтримати наш сайт – натисніть на скарбничку і виберіть будь-який зручний спосіб.

Нові уроки з програмування:

Одна думка про "Перегрузка операторов в С

  1. >> Наприклад, когда какое-то действие приходится повторять в коде много раз, і просто болісно постійно використовувати для цього спеціальні функції - можна перевантажити оператор для цього.

    В цілому то вірно, але перевантаження – це шикарний спосіб вистрілити собі в ногу (і ще отстрелить що-небудь товаришеві). Дуже небезпечна штука. Вона може як підвищити читаність коду, так і все зіпсувати.

    У Маєрс були правила на цю тему (якщо їх не дотримуватися – в пеклі вас змусять підтримувати свій код все 7 кіл). Наприклад:
    – оператор присвоювання повинен повертати посилання на * this;
    – в операторі присвоєння здійснюйте перевірку самопрісваіванія;
    – є целийел про перевантаження new і delete, але я гадаю 99% смертних просто не потрібно чіпати ці оператори;
    – оголошуйте функції, які не є членами, коли перетворення типів повинно бути застосовано до всіх параметрів.
    Ну і ряд інших правил (в декількох книжках).
    Пропоную приділити увагу останньому правилом зі списку. У вас описаний оператор, який спрацює для

    Joke + str1;
    Але не спрацює для
    str1 + Joke;

    Але було б здорово якщо оператор працював би в обидві сторони. Для цього досить зробити його не членом класу (звичайною функцією). Адже це зовсім не складно? )

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>