110 likes | 299 Views
Лекция. перегрузка операций. Операции это функции. a = b + c; a = operator+ (b, c); y = x++; y = operator++ (x);. Операции перегружаются статическими методами. Операции перегружаются только для пользовательских типов.
E N D
Лекция перегрузка операций
Операции это функции a = b + c; a = operator+ (b, c); y = x++; y = operator++ (x); Операции перегружаются статическими методами. Операции перегружаются только для пользовательских типов. При перегрузке не меняется приоритет, ассоциативность и арность операции.
Что можно перегружать Унарные +, -, !, ~, ++, —, true, false Бинарные +, -, *, /, %, &, |, ^, <<, >> Сравнения ==, !=, <, >, <=, >=
Что нельзя перегружать [] () Сокращенные присваивания +=, -=, *=, /=, %=, &=, |=, ^=,<<=, >>=
Класс Vector Вектор на плоскости – два числа, X и Y. classVector { publicfloat X, Y; public Vector(float x, float y) { X = x; Y = y; } }
Операции над векторами • classVector • { • publicfloat X, Y; • // Умножениеслева на число • publicstaticVectoroperator* (float k, Vector v) • { • returnnewVector(v.X * k, v.Y * k); • } • // Вычитаниевекторов • publicstaticVectoroperator- (Vector v1, Vector v2) • { • returnnewVector(v1.X - v2.X, v1.Y - v2.Y); • } • // Модуль вектора • publicstaticfloatoperator! (Vector v) • { • return (float)Math.Sqrt(v.X * v.X + v.Y * v.Y); • } • }
Преобразования типа // Явноепреобразование к float publicstaticexplicitoperatorfloat (Vector v) { return!v; } // Явноепреобразование к bool publicstaticexplicitoperatorbool(Vector v) { returnv.X == 0 && v.Y == 0; }
Применение вектора classBody { publicVectorZ, V; // положение тела и его скорость publicfloat R = 20; publicSize Box; public Body(float x = 0, float y = 0, floatvx = 0, floatvy = 0, float r= 10) { Z= newVector(x, y); V = newVector(vx, vy); R = r; } publicvoid Step(Vector f) { if(Z.X < 0 || Z.X > Box.Width) Z.X = - Z.X; if(Z.Y < 0 || Z.Y > Box.Height) V.Y = -V.Y; V += f; Z+= V; } }
Векторная алгебра Body b = newBody(x: 100, y: 300, vx: 0, vy: 1, r: 20); Body c = newBody(x: 300, y: 300, r: 10); privatevoid timer1_Tick(object sender, EventArgs e) { // Движение в центральном поле float g = 500; Vector R = b.Loc- c.Loc; floatr = !R; // r - модуль вектора Vector F = -g / (r * r * r) * R; b.Step(F); DrawBody(); }
[ Перегрузка операторов true и false ] В C# есть логические литералы true и false и есть логические унарные операторыс таким же именем. Они нужны для поддержки в языке типов, допускающих null(nullable types). publicstaticbooloperatortrue(Vector v) { returnv.X != 0 || v.Y != 0; } publicstaticbooloperatorfalse(Vector v) { returnv.X == 0 && v.Y == 0; } После такой перегрузки объект Vector можно использовать в условиях if, while и т.п.
Самостоятельно • Объявить класс Complex - комплексное число и перегрузить для него арифметические операции. • Объявить класс Coutи перегрузить для него операцию << позволяющую выводить на консоль значения выражений. • Coutcout = new Cout(); • cout << 2 + 3; • Объявить класс Set – множество на базе строки символов. Перегрузить для него операции объединения (+), пересечения(*), разности(/) множеств, предиката вхождения множеств(<=), принадлежности элемента множеству( c % S). Перегрузить преобразование множества в строку и обратно.