Языки программирования развиваются с момента появления первых вычислительных машин. Огромным спросом стало пользоваться Си-семейство от компании Microsoft. А именно – C++ и C#. Это два схожих метода «общения» с программным обеспечением, а также софта между собой. Но разница между ними все равно имеется. Особенно, если углубленно изучать каждый вариант.
Функционал обоих языков поддерживает опцию под названием «перегрузка операторов». В статье будет рассказано о том, что это такое, и когда использовать. А еще – какому программному способу «общения» с устройством отдать – Си Плюс-Плюс или Шарпу.
Сравнение языков – на чем остановиться
В зависимости от того, какому именно языку будет отдано предпочтение при работе, будут меняться некоторые правила и принципы активации тех или иных возможностей при создании кода. Говоря об операторах, а также из так называемой «перегрузке», важно отметить – основные принципы будут сохраняться в обоих случаях. Но для программирования важен не только operator, но и другой «функционал».
C++ — определение
Си Плюс-Плюс – programming language общего назначения. Представляет расширение своего предшественника – C (Си). Имеет следующие преимущества:
- улучшена работа объектов;
- изменено и усовершенствовано поведение элементов программного кода;
- скорость и эффективность после «обновлений» не падает.
Это – вариант, который пригодится каждому современному разработчику. Но новичку начинать с него бывает весьма проблематично из-за синтаксический правил и соглашений.
C# — определение
C Sharp – тоже язык программирования общего назначения. Относится к высокому уровню. Используется в основном для написания контента для .NET-среды. Часто встречается при разработке настольных программ Windows, а также веб-утилит и игрушек.
Ключевые различия
Перед изучением операторов и всего, что с ними связано, главное определиться с тем, каким вариантом пользоваться при разработке контента. Вот основные моменты, в которых два предложенных «метода» отличаются друг от друга:
- у Шарпа есть собственная среда CLR для компиляции, а C++ компилируется спецпрограммами;
- Sharp проще управляет памятью и автоматически собирает мусор;
- У C++ есть множественное наследование, а во втором случае его нет;
- C# чаще на практике используется в Windows.
Также во втором случае нет глобальных функций и заголовков. Шарп больше нацелен на веб-разработки, в то время как «Плюс-Плюс» чаще используется в качестве универсального варианта «кодирования».
Важно: новички могут начать с изучения C#, постепенно переходя к C++. Если сделать наоборот, сначала придется изрядно постараться для достижения успеха, но после освоение второй «лексики» не доставит никаких хлопот.
Терминология
Если программисты нашли «свой язык», можно приступать к его углубленному изучению. Но перед рассмотрением операторов, а также их так называемой «перегрузки», стоит выучить основные термины. Они применяются не только в Си-семействе, поэтому будут полезны каждому будущему разрабу:
- Переменные – элементарные и основные составляющие. Именованные ячейки памяти, которым можно присваивать различные значения.
- Параметры – переменные, которые получают значения аргументов, передаваемых функциям при их вызове.
- Функция – выполняемая подпрограмма. Содержит одно или несколько предложений. Используется для решения тех или иных задач.
- Рекурсия – вызов функции самой себя.
- Полиморфизм – некоторое свойство класса, помогающие решать схожие задачи посредством разных способов. Одно имя здесь используется для нескольких методов со сходными значениями.
- Массивы – переменные одного и того же «вида». Обращение к ним производится по общему «названию».
- Класс – способ определения объектной формы. Своеобразный «устаканенный» алгоритм, шаблон.
- Инкапсуляция – процесс связывания кода с данными, которыми происходит управления. В данном случае применяется защита от внешнего воздействия и ошибок применения.
Большинство перечисленных понятий имеет смысл хорошо заучить, так как они имеют прямое отношение к operator и их перегрузке.
Об операторах
Операторы в C могут быть перегружены или нет. Это – специальные символы, сообщающие компиляторам при обработке информации, какие именно логические или математические манипуляции выполнять. Можно подключать дополнительные operators, но в основном программисты пользуются встроенными.
В C++
Для начала рассмотрим ситуацию с перегрузкой операторов в языке Си Плюс-Плюс. Тогда с Шарпом работать будет значительно проще.
В C++ очень много встроенных библиотечных operator. А именно:
- арифметические;
- присваивания;
- логические (if, else и так далее);
- побитовые;
- реляционные.
Есть и иные операторы, которые не относятся к перечисленным. Именно их стоит указать в специальной таблице, так как остальные – это символы на клавиатуре, которые помогают выполнять преимущественно математические и логические операции, а также сравнивать элементы.
Приоритеты
Приоритет operator определяет группировку имеющихся в выражении терминов. Это помогает повлиять на оценку всего написанного. У некоторых operator более высокий приоритет. Пример – умножение «выше» сложения.
Чтобы лучше разобраться в соответствующем вопросе, достаточно внимательно изучать математику и алгебре в школе. Там учат основным правилам счета, которые в программировании обязательно понадобятся.
Вот таблица, в которой у операторов указан приоритет. Сначала идут более «сильные» элементы:
Внутри того или иного выражения сначала происходит оценка операторов с более высокими приоритетами. Все это предстоит учитывать при написании кода программы. Особенно тогда, когда речь идет о вычислительном контенте.
Перегрузка – определение
Операторы c – это своеобразный указатель, «заставляющий» компилятор совершать те или иные манипуляции. Упомянутый язык предусматривает возможность придания operator особых значений. Соответственно, пользователь сможет его предопределить для юзерских типов информации. Так, «+» задействован для того, чтобы добавлять встроенные данных (float, int и так далее). Добавление двух типов пользовательских материалов требует так называемой перегрузки.
Рассматриваемым термином описывают изменение способа работа операторов для типов (объектов и структур), которые указал пользователь.
Синтаксис
Перегружать операторы необходимо с учетом некоторых правил и принципов. Для используемой «лексики» используется специальная функция «operator». Выглядеть запись при реализации оной будет следующим образом:
Operator в предложенном варианте – это ключевое слово, Symbol – оператор, подлежащий непосредственному «перезапуску».
Унарный оператор
Унарный operator будет работать только с одним единственным операндом. Оператор инкремента ++ и декремента — – своеобразные примеры унарного варианта.
Вот один из наглядных примеров:
После «reload» можно использовать operator для работы так, как удобно. Пример – «++» используется для увеличения значения на 100.
Но в итоге кодификация, которая содержит не только стандартные public static, Int i и другие записи, но и перегрузку, выглядит сложно. Программисты же должны использовать их грамотно.
Указанный пример помогает только в том случае, когда ++ служит префиксом. Сделать его постфиксом можно, если задействовать следующую запись:
- Void operator ++ (int) {
- // code
- }
Здесь круглые скобки – синтаксис для задействования унарных операторов как постфиксов. К параметрам функции они не относятся.
Бинарные операторы
Работа осуществляется через два операнда. Называют их еще операторами сдвига, если используется «<<» или «>>». В данном случае перегрузка осуществляется для определяемых типов посредством записи типа:
Obj3 = obj1 + obj2;
Тут операторные функции вызываются для сдвига и не только через «первый объект», а «второй объект» передается как аргумент операции.
Обычные операторы
При помощи перегрузки операторов можно расширить «стандартный функционал» языка. Со встроенными типами operator нельзя:
- перегружать;
- корректировать приоритет;
- менять ассоциативность;
- создавать собственные operators.
Рассматриваемый процесс реализуется лишь тогда, когда оператор перегружается в качестве отдельной функции или функции-члена класса. Во второй ситуации левый аргумент – это объект *this. Упоминая =, ->, [], (), важно помнить, что они перегружаются как методы, но не как функции.
Если осуществлять запись в определенном порядке, удастся значительно ускорить написание кода, а также избавиться от его дублирования. Вот пример с геометрической точкой в двумерном векторном пространстве:
Далее необходимо запомнить следующие важные сведения:
- Операторы присваивания перегружаются путем копирования и перемещения operator=. По умолчанию кроме конструктора создаются 5 базовых функций. Из-за этого копирование и перемещение лучше поручить компилятору. Либо действовать через идиому Copy-and-swap.
2. Арифметические операторы комбинированного типа (+=, -=, *= и так далее). Сначала реализовывается соответствующая группа. Происходит return значения по ссылке, что позволяет использовать конструкции типа (a+=b)+=c;
3. Арифметические операторы +, *, -, %, /. Для того, чтобы не повторять код, лучше использовать комбинированный оператор. Он не будет производить модификацию объекта класса. Из-за это произойдет возврат нового объекта. Operator вернет const значение. Не придется писать ранее представленную конструкцию.
4. Bool Operator (сравнения). Сначала перегружаются неравенства/равенства. Далее – больше/меньше, после – их аналоги нестрогого типа посредством ранее перегруженных. В геометрических точках подобные операции не определены, поэтому приведенный пример не требует их «перезагружать».
5. Побитовые. Создать перегрузку можно, руководствуясь теми же принципами, что и с арифметическими. В некоторых class требуется битовая маска std::bitset. У & есть унарный аналог, он применяется для того, чтобы взять адрес. Перегрузки обычно не требует.
6. Логические (не стоит путать с бинарными и иными operator). При реализации поставленной задачи теряют уникальные свойства так называемой ленивости.
7. Оператор () – ограничения на тип возвращаемого значения и типы/количество аргументов отсутствуют. Это позволяет создавать так называемые функторы.
8. Передача класса в поток вывода – «активируется» как отдельная функция, а не функция-член. Имеет пометку дружественной. Будет запись типа: friend std::ostream& operator<<(const ostream& s, const Point& p);
.
В остальных случаях общих рекомендаций нет.
Преобразования типов
Операторы языка С (бинарные, равно и так далее) могут быть перегружены (сдвига в том числе), но в Си-семействе предусматривается принцип задания правил преобразования нашего класса к другим типам и классам. Разрешается указывать спецификатор explicit, позволяющий работать с «переделкой» типов лишь тогда, когда программер сослался на это.
Общая запись кода реализации: static_cast<Point3>(Point(2,3));
.
Аллокация и деаллокация
Операторы new new[], delete delete[] тоже подлежат перегрузке. Установленные правила гласят, что данные operator способны принимать любое количество аргументов.
В случае с «нью» первых принимается аргумент типа std::size_t, возврат значения void*, а «делит» — сначала принимает «войд» и ничего не возвращают. Перегружаются как функции или отдельно для определенных классов.
Пользовательский литерал
В c перегрузку операторов осуществляют одним из 4-х типов. Литералы действуют в качестве обычных фкнкций. Принимают только один из типов:
- Const char*;
- Unsigned long long int;
- Long double;
- Char;
- Wchar_t;
- Char16_t;
- Char32_t.
Вот пример перевода миль в километры:
Строковый литерал берет за второй аргумент std::size_t, а первым – остальные варианты. Применяются к записям, которые добавлены в двойных скобках.
Также если использовать в c перегрузку операторов литеральным методом, важно учесть – язык имеет префиксный строковый элемент R. Символы в кавычках воспринимаются равно обычным и не интерпретируются определенными последовательностями в спецсимволы. Так, строка std:: count << R “(Hello!\n)” приведет к тому, что на экране появится результат Hello!\n.
Теперь ясно, каким образом операторы могут быть перегружены в Си Плюс-Плюс. Но это не единственные варианты развития событий. Перегрузки операторов могут использоваться и в Шарпе.
C#
Перегрузка операторов в Шарпе сильно связана с перегрузкой методов. Для первого варианта используется ключевое слово Operator, которое отвечает за определение «операторного метода». Последний может определять действие оператора в пределах соответствующего класса.
Можно использовать две формы операторных методов (operator): :
- для унарных ;
- для бинарных.
Вместо ор происходит подставка перегружаемого оператора, а «возвращаемый тип» — это конкретика типа значения, который возвращается соответствующей операцией. Данный прием упрощает реализацию перегрузки операторов в тех или иных выражениях. В случае с унарными operator происходит обозначение передаваемых операнд, для бинарных то же самое определяется как «операнд1 и операнд2».
Внимание: operator методы должны обладать обоими типами public и static. В угарных вариациях тип операнда будет таким же, как и у класса перезагрузки. В бинарных – хотя бы у одного из операндов. Отсюда следует, что в C# перегрузка операторов для несозданных ранее объектов не предусматривается.