Координаты точки а: 1, 2, 3
Координаты точки b: 10, 10, 10
Результат сложения а+b: 11, 12, 13
Результат присваивания i = а: 6
Результат вычисления выражения а * 2 - b: -988
Как следует из приведенного выше примера программы, когда объект типа ThreeD
используется в таком целочисленном выражении, как i = а
, происходит его преобразование. В этом конкретном случае преобразование приводит к возврату целого значения 6, которое является произведением координат точки а, хранящихся в объекте того же названия. Но если для вычисления выражения преобразование в тип int
не требуется, то оператор преобразования не вызывается. Именно поэтому операторный метод operator int()
не вызывается при вычислении выражения с = а + b
.
Но для различных целей можно создать разные операторы преобразования. Так, для преобразования объекта типа ThreeD
в тип double
можно было бы определить второй оператор преобразования. При этом каждый вид преобразования выполнялся бы автоматически и независимо от другого.
Оператор неявного преобразования применяется автоматически в следующих случаях: когда в выражении требуется преобразование типов; методу передается объект; осуществляется присваивание и производится явное приведение к целевому типу. С другой стороны, можно создать оператор явного преобразования, вызываемый только тогда, когда производится явное приведение типов. В таком случае оператор явного преобразования не вызывается автоматически. В качестве примера ниже приведен вариант предыдущей программы, переделанный для демонстрации явного преобразования в тип int
.
// Применить явное преобразование,
using System;
// Класс для хранения трехмерных координат,
class ThreeD {
int x, y, z; // трехмерные координаты
public ThreeD() { x = y = z = 0; }
public ThreeD(int i, int j, int k) { x = i; y = j; z = k; }
// Перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD op1, ThreeD op2) {
ThreeD result = new ThreeD();
result.x = op1.x + op2.x;
result.y = op1.y + op2.y;
result.z = op1.z + op2.z;
return result;
}
// Выполнить на этот раз явное преобразование типов,
public static explicit operator int(ThreeD op1) {
return op1.x * op1.y * op1.z;
}
// Вывести координаты X, Y, Z.
public void Show()
{
Console.WriteLine(x + ", " + y + ", " + z);
}
}
class ThreeDDemo {
static void Main() {
ThreeD a = new ThreeD(1, 2, 3);
ThreeD b = new ThreeD(10, 10, 10);
ThreeD c = new ThreeD(); int i;
Console.Write("Координаты точки a: ");
a.Show();
Console.WriteLine();
Console.Write("Координаты точки b: ");
b.Show();
Console.WriteLine();
c = a + b; // сложить координаты точек а и b
Console.Write("Результат сложения a + b: ");
c.Show();
Console.WriteLine();
i = (int)a; // преобразовать в тип int явно,
// поскольку указано приведение типов
Console.WriteLine("Результат присваивания i = а: " + i);
Console.WriteLine();
i = (int)a * 2 - (int)b; // явно требуется приведение типов
Console.WriteLine("Результат вычисления выражения а * 2 - b: " + i);
}
}
Оператор преобразования теперь указан в явной форме, и поэтому преобразование должно быть явно приведено к типу int
. Например, следующая строка кода не будет скомпилирована, если исключить приведение типов.
i = (int) а; // преобразовать в тип int явно,
// поскольку указано приведение типов
На операторы преобразования накладывается ряд следующих ограничений.
• Исходный или целевой тип преобразования должен относиться к классу, для которого объявлено данное преобразование. В частности, нельзя переопределить преобразование в тип int
, если оно первоначально указано как преобразование в тип double
.
• Нельзя указывать преобразование в класс object
или же из этого класса.
• Для одних и тех же исходных и целевых типов данных нельзя указывать одновременно явное и неявное преобразование.
Читать дальше