Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Перегрузка условных логических операторов






Для того чтобы применение условных логических операторов & & и || стало возможным, необходимо соблюсти следующие четыре правила:

· В классе должна быть произведена перегрузка логических операторов & и |.

· Перегружаемые методы операторов & и | должны возвращать значение того же типа, что и у класса, для которого эти операторы перегружаются.

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

· Для класса должны быть перегружены операторы true и false.

 

Если все эти условия выполняются, то условные логические операторы автоматически становятся пригодными для применения. Рассмотрим пример:

 

class MyArr

{

// Координаты точки в трехмерном пространстве

public int x, y, z;

 

public MyArr(int x = 0, int y = 0, int z = 0)

{

this.x = x;

this.y = y;

this.z = z;

}

 

// Перегружаем логический оператор &

public static MyArr operator & (MyArr obj1, MyArr obj2)

{

if (((obj1.x > 0) & & (obj1.y > 0) & & (obj1.z > 0))

& ((obj2.x > 0) & & (obj2.y > 0) & & (obj2.z > 0)))

return obj1;

return new MyArr(1, 1, 1);

}

 

// Перегружаем логический оператор |

public static MyArr operator |(MyArr obj1, MyArr obj2)

{

if (((obj1.x > 0) || (obj1.y > 0) || (obj1.z > 0))

| ((obj2.x > 0) || (obj2.y > 0) || (obj2.z > 0)))

return obj1;

return new MyArr(1, 1, 1);

}

 

// Перегружаем логический оператор!

public static bool operator! (MyArr obj1)

{

if ((obj1.x > 0) & & (obj1.y > 0) & & (obj1.z > 0))

return false;

return true;

}

 

// Перегружаем оператор true

public static bool operator true(MyArr obj)

{

if ((obj.x > 0) || (obj.y > 0) || (obj.z > 0))

return true;

return false;

}

 

// Перегружаем оператор false

public static bool operator false(MyArr obj)

{

if ((obj.x > 0) & & (obj.y > 0) & & (obj.z > 0))

return false;

return true;

}

 

// Вспомогательный метод

public static bool And(MyArr obj1, MyArr obj2)

{

if (obj1 & & obj2)

return true;

return false;

}

 

}

 

Благодаря тому что все необходимые правила соблюдены, условные операторы становятся доступными для применения к объектам MyArr. Они действуют следующим образом. Первый операнд проверяется с помощью операторного метода operator true (для оператора ||) или же с помощью операторного метода operator false (для оператора & &). Если удается определить результат данной операции, то соответствующий перегружаемый оператор (& или |) далее не выполняется. В противном случае перегружаемый оператор (& или | соответственно) используется для определения конечного результата. Следовательно, когда применяется условный логический оператор & & или ||, то соответствующий логический оператор & или | вызывается лишь в том случае, если по первому операнду невозможно определить результат вычисления выражения.

Описанный выше способ применения условных логических операторов может показаться, на первый взгляд, несколько запутанным, но если подумать, то в таком применении обнаруживается известный практический смысл. Ведь благодаря перегрузке операторов true и false для класса компилятор получает разрешение на применение условных логических операторов, не прибегая к явной их перегрузке. Это дает также возможность использовать объекты в условных выражениях. И вообще, логические операторы & и | лучше всего реализовывать полностью, если, конечно, не требуется очень узконаправленная их реализация.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал