Языки программирования развиваются с момента появления первых вычислительных машин. Огромным спросом стало пользоваться Си-семейство от компании Microsoft. А именно – C++ и C#. Это два схожих метода «общения» с программным обеспечением, а также софта между собой. Но разница между ними все равно имеется. Особенно, если углубленно изучать каждый вариант.

Функционал обоих языков поддерживает опцию под названием «перегрузка операторов». В статье будет рассказано о том, что это такое, и когда использовать. А еще – какому программному способу «общения» с устройством отдать – Си Плюс-Плюс или Шарпу.

C++ и C#: знакомство с операторной перегрузкой

Сравнение языков – на чем остановиться

В зависимости от того, какому именно языку будет отдано предпочтение при работе, будут меняться некоторые правила и принципы активации тех или иных возможностей при создании кода. Говоря об операторах, а также из так называемой «перегрузке», важно отметить – основные принципы будут сохраняться в обоих случаях. Но для программирования важен не только operator, но и другой «функционал».

C++ — определение

Си Плюс-Плюс – programming language общего назначения. Представляет расширение своего предшественника – C (Си). Имеет следующие преимущества:

  • улучшена работа объектов;
  • изменено и усовершенствовано поведение элементов программного кода;
  • скорость и эффективность после «обновлений» не падает.

Это – вариант, который пригодится каждому современному разработчику. Но новичку начинать с него бывает весьма проблематично из-за синтаксический правил и соглашений.

C# — определение

C Sharp – тоже язык программирования общего назначения. Относится к высокому уровню. Используется в основном для написания контента для .NET-среды. Часто встречается при разработке настольных программ Windows, а также веб-утилит и игрушек.

Ключевые различия

Перед изучением операторов и всего, что с ними связано, главное определиться с тем, каким вариантом пользоваться при разработке контента. Вот основные моменты, в которых два предложенных «метода» отличаются друг от друга:

  • у Шарпа есть собственная среда CLR для компиляции, а C++ компилируется спецпрограммами;
  • Sharp проще управляет памятью и автоматически собирает мусор;
  • У C++ есть множественное наследование, а во втором случае его нет;
  • C# чаще на практике используется в Windows.

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

Важно: новички могут начать с изучения C#, постепенно переходя к C++. Если сделать наоборот, сначала придется изрядно постараться для достижения успеха, но после освоение второй «лексики» не доставит никаких хлопот.

Терминология

Если программисты нашли «свой язык», можно приступать к его углубленному изучению. Но перед рассмотрением операторов, а также их так называемой «перегрузки», стоит выучить основные термины. Они применяются не только в Си-семействе, поэтому будут полезны каждому будущему разрабу:

  1. Переменные – элементарные и основные составляющие. Именованные ячейки памяти, которым можно присваивать различные значения.
  2. Параметры – переменные, которые получают значения аргументов, передаваемых функциям при их вызове.
  3. Функция – выполняемая подпрограмма. Содержит одно или несколько предложений. Используется для решения тех или иных задач.
  4. Рекурсия – вызов функции самой себя.
  5. Полиморфизм – некоторое свойство класса, помогающие решать схожие задачи посредством разных способов. Одно имя здесь используется для нескольких методов со сходными значениями.
  6. Массивы – переменные одного и того же «вида». Обращение к ним производится по общему «названию».
  7. Класс – способ определения объектной формы. Своеобразный «устаканенный» алгоритм, шаблон.
  8. Инкапсуляция – процесс связывания кода с данными, которыми происходит управления. В данном случае применяется защита от внешнего воздействия и ошибок применения.

Большинство перечисленных понятий имеет смысл хорошо заучить, так как они имеют прямое отношение к operator и их перегрузке.

Об операторах

Операторы в C могут быть перегружены или нет. Это – специальные символы, сообщающие компиляторам при обработке информации, какие именно логические или математические манипуляции выполнять. Можно подключать дополнительные operators, но в основном программисты пользуются встроенными.

В C++

Для начала рассмотрим ситуацию с перегрузкой операторов в языке Си Плюс-Плюс. Тогда с Шарпом работать будет значительно проще.

В C++ очень много встроенных библиотечных operator. А именно:

  • арифметические;
  • присваивания;
  • логические (if, else и так далее);
  • побитовые;
  • реляционные.

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

C++ и C#: знакомство с операторной перегрузкой

Приоритеты

Приоритет operator определяет группировку имеющихся в выражении терминов. Это помогает повлиять на оценку всего написанного. У некоторых operator более высокий приоритет. Пример – умножение «выше» сложения.

Чтобы лучше разобраться в соответствующем вопросе, достаточно внимательно изучать математику и алгебре в школе. Там учат основным правилам счета, которые в программировании обязательно понадобятся.

Вот таблица, в которой у операторов указан приоритет. Сначала идут более «сильные» элементы:

C++ и C#: знакомство с операторной перегрузкой

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

C++ и C#: знакомство с операторной перегрузкой

Перегрузка – определение

Операторы c – это своеобразный указатель, «заставляющий» компилятор совершать те или иные манипуляции. Упомянутый язык предусматривает возможность придания operator особых значений. Соответственно, пользователь сможет его предопределить для юзерских типов информации. Так, «+» задействован для того, чтобы добавлять встроенные данных (float, int и так далее). Добавление двух типов пользовательских материалов требует так называемой перегрузки.

Рассматриваемым термином описывают изменение способа работа операторов для типов (объектов и структур), которые указал пользователь.

Синтаксис

Перегружать операторы необходимо с учетом некоторых правил и принципов. Для используемой «лексики» используется специальная функция «operator». Выглядеть запись при реализации оной будет следующим образом:

C++ и C#: знакомство с операторной перегрузкой

Operator в предложенном варианте – это ключевое слово, Symbol – оператор, подлежащий непосредственному «перезапуску».

Унарный оператор

Унарный operator будет работать только с одним единственным операндом. Оператор инкремента ++ и декремента — – своеобразные примеры унарного варианта.

Вот один из наглядных примеров:

C++ и C#: знакомство с операторной перегрузкой

После «reload» можно использовать operator для работы так, как удобно. Пример – «++» используется для увеличения значения на 100.

Но в итоге кодификация, которая содержит не только стандартные public static, Int i и другие записи, но и перегрузку, выглядит сложно. Программисты же должны использовать их грамотно.

Указанный пример помогает только в том случае, когда ++ служит префиксом. Сделать его постфиксом можно, если задействовать следующую запись:

  1. Void operator ++ (int) {
  2. // code
  3. }

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

Бинарные операторы

Работа осуществляется через два операнда. Называют их еще операторами сдвига, если используется «<<» или «>>». В данном случае перегрузка осуществляется для определяемых типов посредством записи типа:

Obj3 = obj1 + obj2;

Тут операторные функции вызываются для сдвига и не только через «первый объект», а «второй объект» передается как аргумент операции.

Обычные операторы

При помощи перегрузки операторов можно расширить «стандартный функционал» языка. Со встроенными типами operator нельзя:

  • перегружать;
  • корректировать приоритет;
  • менять ассоциативность;
  • создавать собственные operators.

Рассматриваемый процесс реализуется лишь тогда, когда оператор перегружается в качестве отдельной функции или функции-члена класса. Во второй ситуации левый аргумент – это объект *this. Упоминая =, ->, [], (), важно помнить, что они перегружаются как методы, но не как функции.

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

C++ и C#: знакомство с операторной перегрузкой

Далее необходимо запомнить следующие важные сведения:

  1. Операторы присваивания перегружаются путем копирования и перемещения operator=. По умолчанию кроме конструктора создаются 5 базовых функций. Из-за этого копирование и перемещение лучше поручить компилятору. Либо действовать через идиому Copy-and-swap.

2. Арифметические операторы комбинированного типа (+=, -=, *= и так далее). Сначала реализовывается соответствующая группа. Происходит return значения по ссылке, что позволяет использовать конструкции типа (a+=b)+=c;

C++ и C#: знакомство с операторной перегрузкой

3. Арифметические операторы +, *, -, %, /. Для того, чтобы не повторять код, лучше использовать комбинированный оператор. Он не будет производить модификацию объекта класса. Из-за это произойдет возврат нового объекта. Operator вернет const значение. Не придется писать ранее представленную конструкцию.

C++ и C#: знакомство с операторной перегрузкой

4. Bool Operator (сравнения). Сначала перегружаются неравенства/равенства. Далее – больше/меньше, после – их аналоги нестрогого типа посредством ранее перегруженных. В геометрических точках подобные операции не определены, поэтому приведенный пример не требует их «перезагружать».

C++ и C#: знакомство с операторной перегрузкой

5. Побитовые. Создать перегрузку можно, руководствуясь теми же принципами, что и с арифметическими. В некоторых class требуется битовая маска std::bitset. У & есть унарный аналог, он применяется для того, чтобы взять адрес. Перегрузки обычно не требует.

6. Логические (не стоит путать с бинарными и иными operator). При реализации поставленной задачи теряют уникальные свойства так называемой ленивости.

7. Оператор () – ограничения на тип возвращаемого значения и типы/количество аргументов отсутствуют. Это позволяет создавать так называемые функторы.

8. Передача класса в поток вывода – «активируется» как отдельная функция, а не функция-член. Имеет пометку дружественной. Будет запись типа: friend std::ostream& operator<<(const ostream& s, const Point& p);.

В остальных случаях общих рекомендаций нет.

Преобразования типов

Операторы языка С (бинарные, равно и так далее) могут быть перегружены (сдвига в том числе), но в Си-семействе предусматривается принцип задания правил преобразования нашего класса к другим типам и классам. Разрешается указывать спецификатор explicit, позволяющий работать с «переделкой» типов лишь тогда, когда программер сослался на это.

C++ и C#: знакомство с операторной перегрузкой

Общая запись кода реализации: static_cast<Point3>(Point(2,3));.

Аллокация и деаллокация

Операторы new new[], delete delete[] тоже подлежат перегрузке. Установленные правила гласят, что данные operator способны принимать любое количество аргументов.

C++ и C#: знакомство с операторной перегрузкой

В случае с «нью» первых принимается аргумент типа std::size_t, возврат значения void*, а «делит» — сначала принимает «войд» и ничего не возвращают. Перегружаются как функции или отдельно для определенных классов.

Пользовательский литерал

В c перегрузку операторов осуществляют одним из 4-х типов. Литералы действуют в качестве обычных фкнкций. Принимают только один из типов:

  • Const char*;
  • Unsigned long long int;
  • Long double;
  • Char;
  • Wchar_t;
  • Char16_t;
  • Char32_t.

Вот пример перевода миль в километры:

C++ и C#: знакомство с операторной перегрузкой

Строковый литерал берет за второй аргумент std::size_t, а первым – остальные варианты. Применяются к записям, которые добавлены в двойных скобках.

Также если использовать в c перегрузку операторов литеральным методом, важно учесть – язык имеет префиксный строковый элемент R. Символы в кавычках воспринимаются равно обычным и не интерпретируются определенными последовательностями в спецсимволы. Так, строка std:: count << R “(Hello!\n)” приведет к тому, что на экране появится результат Hello!\n.

Теперь ясно, каким образом операторы могут быть перегружены в Си Плюс-Плюс. Но это не единственные варианты развития событий. Перегрузки операторов могут использоваться и в Шарпе.

C#

Перегрузка операторов в Шарпе сильно связана с перегрузкой методов. Для первого варианта используется ключевое слово Operator, которое отвечает за определение «операторного метода». Последний может определять действие оператора в пределах соответствующего класса.

Можно использовать две формы операторных методов (operator): :

  • для унарных ;
  • для бинарных.
C++ и C#: знакомство с операторной перегрузкой

Вместо ор происходит подставка перегружаемого оператора, а «возвращаемый тип» — это конкретика типа значения, который возвращается соответствующей операцией.  Данный прием упрощает реализацию перегрузки операторов в тех или иных выражениях. В случае с унарными operator происходит обозначение передаваемых операнд, для бинарных то же самое определяется как «операнд1 и операнд2».

Внимание: operator методы должны обладать обоими типами public и static. В угарных вариациях тип операнда будет таким же, как и у класса перезагрузки. В бинарных – хотя бы у одного из операндов. Отсюда следует, что в C# перегрузка операторов для несозданных ранее объектов не предусматривается.

C++ и C#: знакомство с операторной перегрузкой
C++ и C#: знакомство с операторной перегрузкой