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