390____________________Часть III. Современное программирование на C++
чение равно нулю. Вы можете сами определить для dummy значение, которое кажется вам подходящим для контроля.
В строках 33—38 определена индексная операция для INT_ARRAY. При проверке индексного значения используется трехместная операция ?:. Этот класс включает контроль допустимости индексов в доступ к массиву, но он недостаточно хорошо обрабатывает недопустимые индексы. Хотя обращение по недопустимому индексу и не приводит к записи в чужие области памяти, но пользователь при этом не ставится в известность о появлении недопустимого индекса. Изначально наша проблема приводила к динамическим ошибкам времени выполнения программы и ее краху, теперь она перешла в разряд логических ошибок и может привести разве что к неправильным результатам.
Общие соображения. Давайте подумаем, что тут еще можно улучшить. Во-первых, следует понять, может ли массив данного типа динамически увеличиваться в размерах. Если да, то можно переопределить индексную операцию так, чтобы в случае появления индекса, превышающего текущие границы, выделять дополнительную память. Другое соображение относится к типам данных, которые массив может содержать. Это одна из структур данных, которая может быть реализована независимым от типа данных образом. Под независимостью от типа здесь понимается то, что код будет одним и тем же самым для абсолютно различных типов. В подобных ситуациях класс может быть определен в виде обобщенного класса — так называемого класса-шаблона (подробности см. в главе 19).
Интеллектуальный массив (smart array) является значительным улучшением целочисленного массива. Он упрощает управление памятью — конструктор размещает объекты, деструктор освобождает память; контроль допустимости индексов стал неотъемлемой частью массива. Но при всем при этом он прямо-таки провоцирует вас на дальнейшие усовершенствования. Это очень характерно для C++: ваши классы можно совершенствовать итеративно, последовательными приближениями, версия за версией.
Думая о будущем этого класса, мы не сможем пройти мимо классов-шаблонов. Помимо этого, несколько позже мы вернемся к вопросу, стоит ли расширять массив при появлении недопустимого индекса. Независимо от варианта решения и его реализации, этот класс может заметно выиграть при использовании аппарата обработки исключительных ситуаций (exception handling), который позволяет обработать как ошибки распределения памяти, так и ошибки индексирования (см. главу 22 "Обработка исключительных ситуаций").
'
Операции, не допускающие перегрузки
В табл. 16.2 приведены те немногие операции, которые не допускают перегрузки.