Шаг 106.
Язык программирования C#. Начала
Перегрузка операторов. Перегрузка арифметических и побитовых операторов

    На этом шаге мы приведем простейший пример перегрузки арифметических операторов.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr106_1
{
    class Program
    {
        // Класс с перегрузкой оператора сложения: 
        class MyClass {
            // Целочисленное поле: 
            public int number;
            // Конструктор с целочисленным аргументом: 
            public MyClass(int n) {
                // Присваивание значения полю: 
                number = n;
            }
            // Операторный метод для перегрузки оператора сложения: 
            public static int operator+(MyClass a, MyClass b) {
                // Локальная целочисленная переменная: 
                int m = a.number + b.number;
                // Результат метода: 
                return m;
            }
        }

        // Класс с главным методом: 
        static void Main()
        {
            // Создание объектов класса MyClass:
            MyClass A = new MyClass(100);
            MyClass B = new MyClass(200);
            // Целочисленная переменная: 
            int num;
            // Вычисление суммы объектов: 
            num = A + B;
            // Отображение результата вычисления суммы объектов: 
            Console.WriteLine("A + B = " + num);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы будет таким:


Рис.1. Результат выполнения программы

    Проанализируем программный код примера. В первую очередь нас будет интересовать класс MyClass, поскольку в нем есть операторный метод, с помощью которого выполняется перегрузка оператора сложения для объектов класса.

    У класса есть целочисленное поле number, а также конструктор с одним аргументом (который определяет значение поля). Но нас интересует программный код с описанием операторного метода operator*():

            // Операторный метод для перегрузки оператора сложения: 
            public static int operator+(MyClass a, MyClass b) {
                // Локальная целочисленная переменная: 
                int m = a.number + b.number;
                // Результат метода: 
                return m;
            }

    О чем свидетельствует этот программный код? Атрибуты public и static являются обязательными. Название метода operator+ означает, что метод соответствует оператору "плюс" +. Аргументов у метода два, то есть речь идет о бинарной операции. Оба аргумента описаны как такие, что относятся к классу MyClass. Следовательно, операторный метод будет вызываться для вычисления значения выражений вида А + В, в котором оба операнда А и В являются объектами класса MyClass. Идентификатором типа результата для операторного метода указано ключевое слово int. Поэтому результатом выражения вида А + В будет целое число. Чтобы понять, какое именно, необходимо проанализировать команды в теле метода. Там их всего две. Сначала командой

  int m = a.number + b.number;
вычисляется сумма значений полей складываемых объектов, и результат записывается в переменную m. Затем значение переменной m возвращается результатом метода. Все это означает, что если вычисляется выражение вида А + В, в котором операнды А и В являются объектами класса MyClass, то результатом такого выражения является сумма значений полей number складываемых объектов. В том, что это действительно так, убеждаемся при выполнении главного метода. Там создаются два объекта А и B класса MyClass. Значения нолей объектов равны 100 и 200 соответственно (значение поля определяется аргументом, переданным конструктору при создании объекта). При выполнении команды
  num = A + B; 
целочисленной переменной num значением присваивается результат выражения A + B. Проверка показывает, что переменная num получает значение 300 (сумма чисел 100 и 200), как и должно быть.

    Мы могли переопределить оператор сложения и по-другому, как в плане операндов (аргументов метода), так и в плане результата метода.


Способ, которым мы определили операторный метод в рассмотренном выше примере, подразумевает, что складываются два объекта класса MyClass. Но мы при этом не сможем вычислить, например, сумму объекта и числа или сумму числа и объекта. Чтобы такие операции стали "законными", необходимо описать соответствующие версии операторного метода.

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг