Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


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


Download 2.46 Mb.
bet39/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   35   36   37   38   39   40   41   42   ...   91
Bog'liq
Язык программирования C#

8.3. Перегрузка операторов преобразования

Операторы преобразования позволяют приводить один тип к другому. Различают явное и неявное преобразование типов. Явное преобразование не требует никаких операторов и проходит незаметно от программиста, неявное требует для себя оператора “()”.


Именно благодаря операторам преобразования возможен следующий код.

double d;


int i = 5;
d = i;
d = 3.5;
i = (int)d;
Лист. 8.14

Сначала здесь используется неявное, а затем явное преобразование. Помимо преобразований между стандартными типами программист может определить свои собственные преобразования для создаваемых им классов.


Общий формат для перегрузки оператора неявного преобразования имеет следующий вид:


public static implicit operator тип0(тип1 параметр1)
{
тело оператора
}

Общий формат для перегрузки оператора явного преобразования имеет следующий вид




public static explicit operator тип0(тип1 параметр)
{
тело оператора
}

В этой схеме: тип0 – тип к которому преобразуем, тип1 – тип который преобразуем, параметр – имя формального параметра.


Один из типов либо тип0, либо тип1 должен совпадать и именем класса, в котором перегружен оператор.
Нельзя преобразовывать из типа void и к типу void.
Нельзя сделать одно и тоже преобразование явным и неявным.

Добавим в класс Vector (Лист. 8.12) два преобразования одно неявное к массиву типа double[] и одно явное к массиву типа int[].


// неявное преобразование к double[]


public static implicit operator double[](Vector Source)
{
double[] Result = new double[Source.TheVector.Length];
for (int i = 0; i < Source.TheVector.Length; i++)
Result[i] = Source.TheVector[i];
return Result;
}

// неявное преобразование к int[]


public static explicit operator int[](Vector Source)
{
int[] Result = new int[Source.TheVector.Length];
for (int i = 0; i < Source.TheVector.Length; i++)
Result[i] = unchecked((int )Source.TheVector[i]);
return Result;
}
Лист. 8.15

В представленном листинге неявное преобразование просто возвращает копию поля TheVector, а явное отсекает от элементов массива TheVector дробную часть и возвращает массив int[]. Для преобразований используются стандартные преобразования, определенные для типа double.


Для тестирования этих операторов добавим в конец функции Main класса Program (Лист. 8.13) следующий код.


Vector vector2 = new Vector(10);


for (int i = 0; i < 10; i++)
vector2.TheVector[i] = Math.Sqrt(i);
Console.Write("vector2 = ");
vector2.Show();

double[] dvector2 = vector2;


Console.Write("dvector2 = (");
for (int i = 0; i < 9; i++)
Console.Write(dvector2[i] + ",");
Console.Write(dvector2[9]);
Console.Write(")\n\n");

int[] ivector2 = (int[])vector2;


Console.Write("ivector2 = (");
for (int i = 0; i < 9; i++)
Console.Write(ivector2[i] + ",");
Console.Write(ivector2[9]);
Console.Write(")\n\n");
Лист. 8.16

В этом фрагменте кода создается объект класса Vector vector2, затем этот в цикле поле объект инициализируется корнями чисел от 0 до 9.


После этого объект vector2 сначала приводится к массиву double[], а затем к массиву int[], сразу после приведений эти массивы выводятся.
Вывод кода дополняет Вывод. 8.4 следующими строками:

vector2 = (0,1,1,4142135623731,1,73205080756888,2,2,23606797749979,2,44948974278


318,2,64575131106459,2,82842712474619,3)

dvector2 = (0,1,1,4142135623731,1,73205080756888,2,2,23606797749979,2,4494897427


8318,2,64575131106459,2,82842712474619,3)

ivector2 = (0,1,1,1,2,2,2,2,2,3)


Вывод. 8.6



Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   35   36   37   38   39   40   41   42   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling