Тип operator унарная_операция (параметр)
Примеры заголовков унарных операций:
public static int operator + (DemoArray m)
public static DemoArray operator --(DemoArray m)
public static bool operator true (DemoArray m)
Параметр, передаваемый в операцию, должен иметь тип класса, для которого она определяется. При этом операция должна возвращать:
1) для операций +, -, !, ~ величину любого типа;
2) для операций ++, -- величину типа класса, для которого она определяется;
3) для операций true и false величину типа bool.
Операции не должны изменять значение передаваемого им операнда. Операция, возвращающая величину типа класса, для которого она определяется, должна создать новый объект этого класса, выполнить с ним необходимые действия и передать его в качестве результата.
Пример 1
В качестве примера рассмотрим класс DemoArray, реализующий одномерный массив, в котором содержатся следующие функциональные элементы:
1) конструктор, позволяющий создать объект-массив заданной размерности;
2) конструктор, позволяющий инициализировать объект-массив обычным массивом;
3) свойство, возвращающее размерность массива;
4) индексатор, позволяющий просматривать и устанавливать значение по индексу в закрытом поле-массиве;
5) метод вывода закрытого поля-массива;
6) перегрузка операции унарный минус (все элементы массива меняют свое значение на противоположное);
7) перегрузка операции инкремента;
8) перегруза констант true и false (при обращении к объекту будет возвращаться значение true, если все элементы массива положительные, в противном случае, будет возвращаться значение false).
class DemoArray
{
int[] MyArray;//закрытый массив
public DemoArray(int size) //конструктор 1
{ MyArray=new int[size]; }
public DemoArray(params int[] arr)//конструктор 2
{
MyArray = new int[arr.Length];
for (int i = 0; i < MyArray.Length; i++)
MyArray[i] = arr[i];
}
public int LengthArray //свойство, возвращающее размерность
{
get { return MyArray.Length; }
}
public int this[int i] //индексатор
{
get
{
if (i < 0 || i >= MyArray.Length)
throw new Exception("выход за границы массива");
return MyArray[i];
}
set
{
if (i < 0 || i >= MyArray.Length)
throw new Exception("выход за границы массива");
else MyArray[i] = value;
}
}
public static DemoArray operator -(DemoArray x) //перегрузка операции унарный минус
{
DemoArray temp = new DemoArray(x.LengthArray);
for (int i = 0; i < x.LengthArray; ++i) temp[i] = -x[i];
return temp;
}
public static DemoArray operator ++(DemoArray x) //перегрузка операции инкремента
{
DemoArray temp = new DemoArray(x.LengthArray);
for (int i = 0; i < x.LengthArray; ++i) temp[i] = x[i]+1;
return temp;
}
public static bool operator true(DemoArray a) //перегрузка константы true
{
foreach (int i in a.MyArray) if (i<0) return false;
return true;
}
public static bool operator false(DemoArray a)//перегрузка константы false
{
foreach (int i in a.MyArray) if (i>0) return true;
return false;
}
public void Print(string name) //метод – выводит поле-массив на экран
{
Console.WriteLine(name + ": ");
for (int i = 0; i < MyArray.Length; i++)
Console.Write(MyArray[i] + " ");
Console.WriteLine();
}
}
class Program
{
static void Main()
{
try
{
DemoArray Mas = new DemoArray(1, -4, 3, -5, 0);//вызов конструктора2
Mas.Print("Исходный массив");
Console.WriteLine("\nУнарный минус");
DemoArray newMas=-Mas; //применение операции унарного минуса обратите внимание, что создается новый объект и знаки меняются
Mas.Print("Mассив Mas");
newMas.Print("Массив newMas"); //только у нового массива Console.WriteLine("\nОперация префиксного инкремента");
DemoArray Mas1=++Mas;
Mas.Print("Mассив Mas");
Mas1.Print("Mассив Mas1=++Mas");
Console.WriteLine("\nОперация постфиксного инкремента");
DemoArray Mas2=Mas++;
Mas.Print("Mассив Mas");
Mas2.Print("Mассив Mas2=Mas++");
if (Mas)
Console.WriteLine("\nВ массиве все элементы положительные\n");
else
Console.WriteLine("\nВ массиве есть не положительные
элементы\n");
}
catch (Exception e) { Console.WriteLine(e.Message); }
}
}
Бинарные операции
При разработке класса можно перегрузить следующие бинарные операции: + - * / % & | ^ << >> == != < > <= >=. Обратите внимание, операций присваивания в этом списке нет.
Синтаксис объявителя бинарной операции:
Дата добавления: 2015-10-26; просмотров: 843;