Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Часть V. Полезные особенности. Правила для неявных преобразований . Правила для неявных преобразований
Второе выражение приводит к тому же эффекту, но более хитрым путем. C++ пы- тается разобраться с выражением = dl + сначала конвертируя и d2 в dou- ble , а затем конвертируя сумму обратно в USDollar. Логика этого процесса как и в первом выражении, однако в данном случае работу, где это только возможно, берет на себя C++. Этот пример демонстрирует как преимущества, так и недостатки оператора преобразования. Обеспечивая C+ + функцией преобразования из USDollar в double , программист освобождается от необходимости создавать полный набор операторов. Класс USDollar может просто воспользоваться операторами, опреде- ленными ДЛЯ double. С другой стороны, предоставление метода преобразования лишает программи- ста возможности контролировать, какие из операторов определены. Если опреде- лена функция преобразования в double, для USDollar будут использоваться опе- раторы doubl e независимо от того, имеет ли это смысл. Кроме того, выполнение большого количества преобразований приведет к значительному уменьшению эффективности программы. Например, приведенное только что простое сложение требует выполнения трех функций преобразования и всех сопутствующих им функций умножения, деления и т.п.
Правила для неявных преобразований Разбираясь со всеми этими преобразованиями, я так и не объяснил, как C++ по- ступит со сложением USDollar dl и double d2. Правила для таких операций доста- точно просты. 1 Сначала C++ ишет функцию operator + (USDollar, double). 2. Если она не найдена, C++ ищет функцию, которая может быть исполь- зована для преобразования USDollar в double. И наконец, C++ ищет функцию, которая преобразует хоть что-то из этих двух переменных в нечто иное. Первый пункт ясен, поскольку соответствующая функция уникальна; однако два последних пункта несколько туманны. Распространенная ошибка № 6. Если возможен более чем один способ вы- полнения операции, на этапе компиляции будет сгенерирована ошибка.
Если существует два возможных преобразования объекта, компилятор также вы- даст ошибку. Распространенная ошибка № 7. Вы не можете предоставить два способа вы- полнения преобразования для одного типа. Например, приведенный ниже код вызовет сообщение об ошибке.
class A {
А(В& } ; class В {
operator A{); Глава 24. Перегрузка операторов 277 Если потребуется выполнить преобразование объекта класса в в объект класса А, компилятор не будет знать, использовать ли ему оператор преобразования В: :operato r A() для в или конструктор А: для А, поскольку оба они по- лучают в качестве аргумента объект класса В и создают из него объект класса А. Возможно, результат преобразования в обоих случаях будет одинаков, но компиля- тору это не Он должен точно знать, какой из способов преобразования вы имеете в виду. Если это не выясняется однозначно, компилятор умывает свои элек- тронные руки и выдает сообщение об ошибке, предоставляя разбираться в проблеме программисту.
|
Последнее изменение этой страницы: 2019-04-19; Просмотров: 209; Нарушение авторского права страницы