С++ для начинающих Перегрузка операторов Первое знакомство

Эта статья на тему Самое первое знакомство с перегрузкой операторов для начинающих. Тема перегрузки операторов достаточно-таки часто встречающаяся и новички постоянно могут слышать: «Просто перегрузи оператор». Все бы ничего, но тема эта глазами новичка смотрится достаточно экзотически. А если перед изучением С++ были другие языки программирования, этой возможности не имеющие, то и идет тема перегрузки операторов достаточно тяжело. Конечно, я не могу сказать за всех, но по себе точно могу. Мне далась совсем не сразу и как-то тяжело пошла. Даже книги не особо помогали, а примеры, которые были на первых попавшихся сайтах имели лишнюю информацию, мешающую быстрому пониманию такой темы, как «Перегрузка операторов»
Так как это тема — первое знакомство с перегрузкой операторов, то сильно и обо всем сразу писать я не стану. Просто покажу и объясню достаточно простым примером элементарную перегрузку оператора +

Теперь поясню, что это вообще за чудо такое, что означает «Перегрузка операторов»
Перегрузка операторов обозначает, что почти любому из известных компилятору операторов, можно назначить свое поведение. Меня, правда, путает немного определения оператора в С++, но сейчас речь идет об операторах, которые можно посмотреть в таблице википедии

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

Ближе к делу. Самый простой оператор, известный нам всем — это оператор сложения, знак +. Все мы его ассоциируем одинаково (для чисел — сумма, для строк, например, соединение). Первый пример, на котором я пытался понять как перегружать операторы — был примером со строками. Информация из того примера есть на страницах моего сайта, но мне не очень нравится, ибо тема не раскрыта и нагружена лишним. Стиль мой не соответствует тому материалу. Вот потому решил я добавить статьи максимально простым примером перегрузки оператора сложения. Уверен, начинающие лучше начнут ориентироваться, если им показать простой пример.

Сейчас нужно будет немного напрячь мозг, без этого никак понять не выйдет. Будет использован класс. В классе будет использован конструктор класса. И будет использована возможность перегрузки оператора. Если Вам тема классов совсем незнакома, то очень советую для начала изучить понятие класса и конструктора класса. Без этих знаний понять тему тяжелее.

Простой класс c конструктором, который принимает параметр и отдает его в закрытую переменную

Я на объяснении работы самого класса останавливаться не стану. Я уже предупредил, что нужно иметь представление. Тема все-таки — перегрузка операторов, а не классы. Вот в этом коде мало информации, поэтому легко увидеть ключевую фразу int operator+ (MyClass obj). Уверен, что многие новички будут рады узнать что она обозначает.
Здесь operator — обозначает, что программист будет перегружать какой-то оператор
+ после operator обозначает, что оператором этим будет +
а все выражение operator+ можете воспринимать как самую обычную функцию. Считайте, что это имя такое функции и увидите, что, действительно, совсем от функции запись не отличается. Как и функция возвращает значение типа int, как и функция принимает параметр для обработки.(сейчас тип «функции» int, но можно void, любой другой вариант)

Вот перед тем как продолжить чтение этой несложной статьи, конкретно врубитесь в то, что выше сказано. Очень надеюсь что пока все очень понятно и вопросов не возникает. Если все в норме, тогда идем дальше.

Перегрузка операторов возможна только для определенных пользователем типов данных. Т.е. только для классов, которые он создает. Поэтому от классов тут никак не избавишься (некоторые их побаиваются сначала). Структуры — те же классы (это так, на всякий случай некоторым).

Так как у нас есть класс, то можно создать объект, тип которого будет соответствовать описанному классу. Поэтому, создадим такой объект.

Чтобы сориентироваться в том, что происходит, нужно понимать тему конструктор класса. Здесь создется 3 переменные типа MyClass и в каждую из них передается свое значение, которое принимается конструктором как параметр, а внутри конструктора передаётся в переменную i (которая закрыта от доступа напрямую)

Вот только сейчас наступил долгожданный момент. Момент использования возможности перегрузки оператора сложения. В коде я уже обозначил прототипом, что буду перегружать оператор +, но не дописал функцию, поэтому возможности этой пока еще не наблюдается. Так как я сказал ранее, что можно воспринимать ту запись, как функцию (вы ведь поняли, о какой я), то и будем дописывать ее как самую обычную функцию.

На этом этапе я сознательно сделал таким образом, чтобы показать, что работает запись вида operator+ подобно обычным функциям, но с небольшим отличием. Вызывается автоматически, если находит свой оператор в тексте программы. (для объектов класса, в котором описан). Сейчас это оператор сложения. Вот вы уже и сами можете догадаться, что эта такая своеобразная функция может вернуть любое значение, но нам не интересно любое, нам нужно просто сложить два числа из разных объектов, используя возможность перегрузки операторов.

Тут вот небольшая загвоздка для начинающих есть, я ее хорошо чувствую, но понять это не так сложно. В коvментируемой строке, выражение А+B представляет собой выражение из двух операндов (A, как объекта класса и B как объекта класса) с оператором +. Так как для класса описано поведение оператора + и внутри программы этот оператор плюс встречается, то автоматически срабатывает функция, описывающая поведение объектов c таким оператором.
В записи

i — Обозначает переменную первого операнда (сейчас это A, т.к. в A+B — A первый)
obj.i — Обозначает переменную второго операнда
(напишите obj.i+obj.i и легко убедитесь)
obj — это обычный параметр функции и может иметь любое другое название, а i — это переменная, описанная внутри класса.
В общем, чтобы проще было соориентироваться, условно считайте, что первый операнд A принимает в себя второй операнд B и поэтому первый параметр в return идет как обычная переменная, а вторая переменная узнается только после обращения к объекту (параметру).

Проверяем работу и видим, то что видим. Видим эффект перегрузки оператора сложения. Можете делать с ним, что хотите, например, чтобы он отдавал не сумму, а ближайшее к сумме простое число (просто дописать функции поиска и вернуть результаты поиска из функции, описанной как operator+.

Я бы, наверное не стал писать на столь уж простую тему, но так получается, что некому написать. Я в 2014 году не смог найти настолько простого объяснения, которое быстро бы мне помогло понять даже просто смысл перегрузки операторов. Да и примеры из первых страниц поисков, правда, напичканы излишней информацией.

Так как это первое знакомство с перегрузкой операторов, то что-то я здесь оговаривать не стал. Но вы должны знать, что этот вариант перегрузки работает только с такими операторами, которые требуют двух операндов (только с бинарными операторами). Можете потренироваться писать с разными бинарными (это те, которым надо два операнда). Надеюсь после прочитанного это будет достаточно просто сделать. Экспериментируйте и удачи всем вам в этом 🙂
(Слева что-то) знак (Справа что-то) ==> значит знак представляет собой бинарный оператор.

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

  • Золотое правило напоследок:
    Перегрузка операторов не должна усложнять чтение кода, а должна облегчать его чтение.

так что не переусердствуйте и не увлекайтесь очень сильно (может причинить вред)

А вот вам что-то типа домашнего задания на самостоятельный разбор для закрепления

Нужно сделать так: (20-7)/(30.5-10). На экране 266,5

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

7 комментариев: С++ для начинающих Перегрузка операторов Первое знакомство

  • Vlad говорит:

    «(20-7)/(30.5-10)»- из этого уравнения у меня получилось(0,634146). А На экране 266,5-это что?

  • Алексей говорит:

    У меня получился вот такой код и выводит 0,634146. Откуда вы вообще взяли 266.5?

    Автор сайта отвечает:

    20	30,5	7	10
    ___________
    20-7  =	 13
    30,5-10= 20,5
    ___________
       13*20,5=   266,5
    
  • дон говорит:

    thanks ^^!

  • kirill говорит:

    Почему мы 13 и 20.5 умножае ?если по вашей формуле нужно делить.Вы показываете умножение,а перегрузка оператора не нужна?

  • kirill говорит:

    Вы мне подскажите,может я что-то неправильно понимаю.

    • admin говорит:

      Перегрузка операторов — это изменение смысла оператора. Плюсом можно не только складывать, но и делить и умножать и даже описывать решение сложных формул. Чтобы плюс делал нечто подобное, его поведение описывают в том же виде, как описывают функции.
      Это не самый удачный пример получился, к сожалению, смысл этой задачки только в том, чтобы понять что поведение операторов можно описать удобным для нас способом.

  • kirill говорит:

    Спасибо за ответ.

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- Я тут котёнка завела. Помоги придумать какое-нибудь компьютерное имя... - Мышка! - Ты чё, это же котик! - Ну, тогда БЛОХ ПИТАНИЕ.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок