Язык С++ и программирование на нем. Рейзлин В.И. - 123 стр.

UptoLike

Составители: 

125
падет надобность. Заметим, что здесь не только происходит неявный
вызов конструктора complex, но и неявное стандартное преобразование
значения типа int к типу double. Число уровней неявных преобразова-
ний ограничено. При этом правила таковы: компилятор может выпол-
нить не более одного неявного стандартного преобразования и не более
одного неявного преобразования, определенного программистом.
Пример:
сlass A{ public:
A (double d){. . .}
};
class B{ public:
B (A va){. . .}
};
class C{ public:
C (B vb){ . . .}
};
A var1 (1.2); // A(double)
B var2 (3.4); // B(A(double))
B var3 (var1); // B(A)
C var4 (var3); // C(B)
C var5 (var1); // C(B(A))
C var6 (5.6); // Ошибка! Неявно вызывается C(B(A(double)))
C var7 (A(5.6)); // C(B(A))
Ошибка при создании переменной var6 связана с тем, что необхо-
димо два уровня неявных нестандартных преобразований, выполняю-
щихся с помощью вызова конструкторов: double к А, а затем A к В.
При создании переменной var7 одно из этих преобразований
double к А сделано явным, и теперь все будет нормально.
Таким образом, конструктор с одним аргументом
Class::Class(type) всегда определяет преобразование типа type к типу
Class, а не только способ создания объекта при явном обращении к не-
му.
Для преобразования абстрактного типа к стандартному или абст-
рактного к абстрактному в С++ существует средство функция, выпол-
няющая преобразование типов, или операторфункция преобразова-
ния типов.
Она имеет вид
Class::operator type (void);