|
Программирование >> Программирование на языке c++
дартные преобразования типов, определенные в самом языке. Рассмотрим пример: class my class { my class(int); }; void my function(double); void my function(my class); void function(void) { my function(5); } Здесь вызов функции my function(5), на первый взгляд, приводит к неоднозначности, поскольку выражения my function (double(5)) и my functio,n(my class(5)) являются правильными. Однако первое выражение использует только стандартное преобразование типа и именно оно будет выбрано. В результате здесь нет ошибки и производится вызов функции my function(double(5)). В целом в языке С++ принято следующее правило преобразования типов. Проверяется вся имеющаяся информация о преобразовании типов с учетом установленных правил и рассматриваются все возможные преобразования. Если находится вариант, который не приводит к неоднозначности, то он и представляет собой решение этой задачи. Рассмотрим примеры. Первая программа демонстрирует преобразование стандартного типа (например, float) к типу класс (например. А) и типа класс (например. А) к стандартному типу (например, char). #include <iostream.h> class A { float f; char c; public: A(float F) : f(F),c(#) {} operator float() { return f; } преобразование к типу float operator char() { return c; } преобразование к типу char void main{void) { Aa1=22.23; float ff; char сс; ff=a1; в результате ff=22.23 cc=a1; в результате сс=# cout ff V сс endl; Результат: 22.23 # cout al; ошибка из-за неоднозначности Вторая программа показывает возможную неоднозначность при передаче объекта класса в функцию в виде параметра (при условии, что выполняются преобразования типа). #include <iostream.h> class А { float f; public: A(float F) : f(F) {} operator float() { return f; } class В { float f; public: B(float F) : f(F) {} operator float() { return f; } void f(A aa) { cout aa endl; } void f(B bb) { cout bb endl; } void ff(B bb) { cout bb endl; } void main(void) { f(10); ошибка: Ambiguty between f(A) and f(B) f(A(1.56)); Результат: 1.56 f(B(2.11)); Результат: 2.11 ff(10); Результат: 10 Здесь при вызове функции f(10) неизвестно, какой параметр ей необходимо передать: А(10) или В(10). Третий пример показывает невозможность двух-уровнего преобразования типа (такое преобразование надо задавать явно). #include <iostream.h> class А { float f; public: A{float F) : f(F) {} operator float{) { return f; } class В { float f; public: B(A aa) : f(aa) {} параметром конструктора является объект аа класса А operator float() { return f; } void ff(B bb) { cout bb endl; } void main(void) { ff(10); ошибка: cannot convert int to B ff(B(10)); Явное преобразование. Результат: 10 ff(B(2.11)); Явное преобразование. Результат: 2.11 Последний пример демонстрирует приоритетность стандартных преобразований типа. #include <iostream.h> class А { float f; public: A(float F) : f(F) {}
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |