Лекции (7) (1119478), страница 2
Текст из файла (страница 2)
f ( (long) ( a.operator int()) ); т.е. f (long)- на шаге г).g (1); // O.K. g ( S ( (long) 1) );т.е. g (S)- на шаге г).g (0); // O.K. g ( (char*) 0);т.е. g (char*) - на шаге в)!!!h (1); // O.K. h ( S ( (long) 1) );т.е. h (const S&) - на шаге г).21}Замечание 1.Пользовательские преобразования применяются неявно только в томслучае, если они однозначны!Пример:class Boolean {int b;public:Boolean operator+ (Boolean);Boolean (int i) { b = i != 0;}operator int () { return b; }...};void g () {Boolean b (1), c (0); // O.K.int k;c = b + 1; // Er.! т.к. может интерпретироваться двояко:// b.operator int () +1 – целочисленный ‘+’ или// b.operator+ (Boolean (1)) – Boolean ‘+’k = b + 1; // Er.! -- “ -}22Замечание 2.Допускается не более одного пользовательского преобразованиядля обработки одного вызова для одного параметра!Пример:class X { ...
public: operator int (); ... };class Y { ... public: operator X (); ... };void f () {Y a;int b;b = a; // Er.! , т.к. требуется a.operator X ().operator int ()...}Но! явно можно делать любые преобразования, явноепреобразование сильнее неявного.23д)Отождествление по ... .Пример1:class Real {public:Real (double);...};void f (int, Real);void f (int, ...);// можно и без ‘,’void g () {f (1,1);// O.K. f (int, Real);f (1, “Anna”); // O.K. f (int, ...);}24Пример2:Многоточие может приводить кнеоднозначности:void f (int);void f (int ...);void g () {...f (1); // Er.! т.к. отождествление по// первому параметру дает// обе функции.}25.