Второе выражение приводит к тому же эффекту, но более хитрым путем. C++ пытается разобраться с выражением d3 = dl + d2, сначала конвертируя dl и d2 в double, а затем конвертируя сумму обратно в USDollar. Логика этого процесса такая-$рр, как и в первом выражении, однако в данном случае работу, где это только возможно, берет на себя C++. Этот пример демонстрирует как преимущества, так и недостатки оператора преобразования. Обеспечивая C++ функцией преобразования из USDollar в double, программист освобождается от необходимости создавать полный набор операторов. Класс USDollar может просто воспользоваться операторами, определенными ДЛЯ double. С другой стороны, предоставление метода преобразования лишает программиста возможности контролировать, какие из операторов определены. Если определена функция преобразования в double, для USDollar будут использоваться операторы double независимо от того, имеет ли это смысл. Кроме того, выполнение большого количества преобразований приведет к значительному уменьшению эффективности программы. Например, приведенное только что простое сложение требует выполнения трех функций преобразования и всех сопутствующих им функций умножения, деления и т.п. Правила для неявных преобразований <strong>Р</strong>азбираясь со всеми этими преобразованиями, я так и не объяснил, как C++ поступит со сложением USDollar dl и double d2. Правила для таких операций достаточно просты. 1 Сначала C++ ишет функцию operator+ (USDollar, double). 2. Если она не найдена, C++ ищет функцию, которая может быть использована для преобразования USDollar в double. 3 И наконец, C++ ищет функцию, которая преобразует хоть что-то из этих двух переменных в нечто иное. Первый пункт ясен, поскольку соответствующая функция уникальна; однако два последних пункта несколько туманны. <strong>Р</strong>аспространенная ошибка № 6. Если возможен более чем один способ выполнения операции, на этапе компиляции будет сгенерирована ошибка. Если существует два возможных преобразования объекта, компилятор также выдаст ошибку. <strong>Р</strong>аспространенная ошибка № 7. Вы не можете предоставить два способа выполнения преобразования для одного типа. Например, приведенный ниже код вызовет сообщение об ошибке. class A { public: А(В& Ь) ; }; class В { public: operator A{); Глава 24. Перегрузка операторов 277
Если потребуется выполнить преобразование объекта класса в в объект класса А, компилятор не будет знать, использовать ли ему оператор преобразования В: :operator A() для в или конструктор А: :А(В&) для А, поскольку оба они получают в качестве аргумента объект класса В и создают из него объект класса А. Возможно, результат преобразования в обоих случаях будет одинаков, но компилятору это не известно. Он должен точно знать, какой из способов преобразования вы имеете в виду. Если это не выясняется однозначно, компилятор умывает свои электронные руки и выдает сообщение об ошибке, предоставляя разбираться в проблеме программисту. 278 Часть V. Полезные особенности
- Page 3 and 4:
y Stephen R. Davis IDG BOOKS WORLDW
- Page 5 and 6:
ББК32.973.26-018.2 я 75 Д94 У
- Page 7 and 8:
Содержание Об авто
- Page 9 and 10:
Сравнение указател
- Page 11 and 12:
Работа с деструкто
- Page 13 and 14:
Моим друзьям и семь
- Page 15 and 16:
Введение 0
- Page 17 and 18:
В предыдущем издан
- Page 19 and 20:
использованные в э/
- Page 21 and 22:
В э/ной наани... И но
- Page 23 and 24:
Язык С оказался дей
- Page 25 and 26:
ше использовать им
- Page 27 and 28:
Таким многословным
- Page 29 and 30:
Оформленные таким
- Page 31 and 32:
как результата выч
- Page 33 and 34:
Объявление /газных
- Page 35 and 36:
Начиная с этой стро
- Page 37 and 38:
объявление перемен
- Page 39 and 40:
Эти символы помога
- Page 41 and 42:
Окончание табл. 3.1 П
- Page 43 and 44:
выполнение tjHafutMX оп
- Page 45 and 46:
Глава 4 Выполнение
- Page 47 and 48:
как соотношения ме
- Page 49 and 50:
Другие системы счи
- Page 51 and 52:
Оператор & определя
- Page 53 and 54:
Зачем придуманы эт
- Page 55 and 56:
2-я последовательно
- Page 57 and 58:
} return 0; Программа whil
- Page 59 and 60:
ной цикла. Условие
- Page 61 and 62:
Но... ничто не вечно
- Page 63 and 64:
Вложенные команды
- Page 65 and 66:
\ case 3: //' обработка с
- Page 67 and 68:
В э&ои час&и... Выпол
- Page 69 and 70:
Согласно синтаксис
- Page 71 and 72:
И аргументы, и возв
- Page 73 and 74:
} cout « "Эта программ
- Page 75 and 76:
Такие аналогии меж
- Page 77 and 78:
} int localVariable; static int sta
- Page 79:
С помощью массивов
- Page 82 and 83:
Выход за границы ма
- Page 84 and 85:
f or i int i = 0 ; i< sizeOfloat. A
- Page 86 and 87:
cout
- Page 88 and 89:
Обработка символов
- Page 90 and 91:
расположении перем
- Page 92 and 93:
Теперь используем
- Page 94 and 95:
*pintvar = 100. С не вызыв
- Page 96 and 97:
эта переменная дос
- Page 98 and 99:
сохранение значени
- Page 100 and 101:
Повторное знакомст
- Page 102 and 103:
Использование указ
- Page 104 and 105:
заканчивается полу
- Page 106 and 107:
} charArrayflO] - 'О'; * (charArra
- Page 108 and 109:
case 1: pszReturnValue = "Янва
- Page 110 and 111:
Глава 10 Прочие функ
- Page 112 and 113:
накопление последо
- Page 114 and 115:
Создание модуля MainM
- Page 116 and 117:
7. Выберите пункт ме
- Page 118 and 119:
Глава 11 Отладка про
- Page 120 and 121:
: с: \wiNNT\System32\command.com -
- Page 122 and 123:
ошибка находится в
- Page 124 and 125:
Введите следующее
- Page 126 and 127:
Таблица 11.1. Команды
- Page 128 and 129:
мую команду. (Испол
- Page 130 and 131:
Теперь достоверно
- Page 132 and 133:
! f _cSfc/*№it*le E File Edit t 1
- Page 134 and 135:
void init(unsigneds accountNumber,
- Page 136 and 137:
Чтобы продемонстри
- Page 138 and 139:
Часть III "Классичес
- Page 140 and 141:
Глава 12 Знакомство
- Page 142 and 143:
Люди склонны заним
- Page 144 and 145:
После ключевого сл
- Page 146 and 147:
cin >> nds.firstName; if (stricmp(n
- Page 148 and 149:
Глава 14 Работа с кл
- Page 150 and 151:
Микроволновая печь
- Page 152 and 153:
Student s; void fn(void) { //это
- Page 154 and 155:
Объект, для которог
- Page 156 and 157:
добавляем новый ку
- Page 158 and 159:
}; float grade () ; //...прочи
- Page 160 and 161:
invariable; //объявление
- Page 162 and 163:
eturn 0; Теперь "ps вычи
- Page 164 and 165:
#include #include class Student {
- Page 166 and 167:
Возв[гшн к tct/че Про
- Page 168 and 169:
Другие операции на
- Page 170 and 171:
} // указывать на вст
- Page 172 and 173:
Глава 16 Защищенные
- Page 174 and 175:
} //повысим свой рей
- Page 176 and 177:
эта функция — друг
- Page 178 and 179:
Глава 17 Создание и
- Page 180 and 181:
Однако, как уже отм
- Page 182 and 183:
В одной строке може
- Page 184 and 185:
Работа с деструкто
- Page 186 and 187:
Глава 18 Аргументац
- Page 188 and 189:
int main(int argcs, char* pArgs[])
- Page 190 and 191:
} Student freshMan("Smell E. fish")
- Page 192 and 193:
Компилятор сообщае
- Page 194 and 195:
protected: int value class Student
- Page 196 and 197:
С точки зрения прив
- Page 198 and 199:
При отладке такой п
- Page 200 and 201:
Глава 19 Копирующий
- Page 202 and 203:
} cout
- Page 204 and 205:
Создаем нового сту
- Page 206 and 207:
Для решения указан
- Page 208 and 209:
} // временный объек
- Page 210 and 211:
Глава 20 Статически
- Page 212 and 213:
noOfStudents++; //обращени
- Page 214 and 215:
class Student { public: static int
- Page 216 and 217:
Что такое this Я уже у
- Page 219 and 220:
функция display — отоб
- Page 221 and 222:
for (int j=0; j < noSvgAccounts; j-
- Page 223 and 224:
Сумма по сберегате
- Page 225 and 226:
В э*яой чаани... Из д
- Page 227 and 228: кода. Представьте с
- Page 229 and 230: public: int qualifier( > { return q
- Page 231 and 232: sor. Однако вы можете
- Page 233 and 234: int main (int argcs, char* pArgs[])
- Page 235 and 236: Зачем нужен полимо
- Page 237 and 238: #include class Base public: virtua
- Page 239 and 240: сначала выключить
- Page 241 and 242: Единственное отлич
- Page 243 and 244: к классу дополните
- Page 245 and 246: Checking I withdrawal!) 1 i — 1 d
- Page 247 and 248: унаследуют эти изм
- Page 249 and 250: Концепция абстракт
- Page 251 and 252: virtual void write(char *pString);
- Page 253 and 254: pAcc->withdrawal(100.OOf); //это
- Page 255 and 256: BUDGET3.CPP — Программа
- Page 257 and 258: Account* next() } return (Account*)
- Page 259 and 260: if (++noWithdrawals > 1) { balance
- Page 261 and 262: Введите номер счет
- Page 263 and 264: сконцентрироватьс
- Page 265 and 266: в э&ой чхшпи... В это
- Page 267 and 268: Я осознаю, что это с
- Page 269 and 270: int main(int argcs, char* pArgs[ US
- Page 271 and 272: } return si; Проблема в т
- Page 273 and 274: Oneficwiofibi как функции
- Page 275 and 276: ...тело функции здес
- Page 277: Распространенная о
- Page 281 and 282: Копирующий констру
- Page 283 and 284: Класс Name содержит р
- Page 285 and 286: оператор присвоени
- Page 287 and 288: Время вводить новы
- Page 289 and 290: Первый аргумент эт
- Page 291 and 292: Функция открывает
- Page 293 and 294: i cout
- Page 295 and 296: Написание сода&вен
- Page 297 and 298: Заметьте, что эта ф
- Page 299 and 300: редается объект uSDol
- Page 301 and 302: try { // Эта строка ген
- Page 303 and 304: управление перелае
- Page 305 and 306: filetsizeof file - 1] = 'NO'; lineN
- Page 307 and 308: Глава 28 Множествен
- Page 309 and 310: Ответ прост: оба. Кл
- Page 311 and 312: М-да... "Не говори "го
- Page 313 and 314: void fn() SleeperSofa ss; cout « "
- Page 315 and 316: Указатели рВ1 и рВ2
- Page 317 and 318: S э&ой чаани,.. Ни одн
- Page 319 and 320: Умный компилятор (т
- Page 321 and 322: МомменйифциЖе свою
- Page 323 and 324: Приложение А Слова
- Page 325 and 326: Полиморфизм Порожд
- Page 328 and 329:
цказсиОель --, 36; 42 !,
- Page 330 and 331:
Оператор присвоени
- Page 332 and 333:
ПРОГРАММИРОВАНИЯ Д
- Page 334 and 335:
»лия ПОЛЬЗОВАТЕЛЯ
- Page 336 and 337:
ерия компьютерных