Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Часть 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.016 с.)
Главная | Случайная страница | Обратная связь