|
Программирование >> Расширенная версия языка c++
/лава 6. Введение грузкуоператоров 201 int main о arraytype ob; int i; Здесь проблем нет * : for{i=0; K3I2E; i++) ., : uv cout ob[i] ; . . , [ , ,1 ; ..... /* А здесь при выполнении программы генерируется обка, поскольку значение SIZE+100 не входит в заданный диапазон */ ob[SIZE+100] =99; Ошибка!!! return 0; .) .... о...: Благодаря контролю границ, реализованному в функции tor[](), при выполнении инструкции ob[SIZE+100] =99; программа завершится еще до того, как будет повреждена какая-либо ячейка памяти. Поскольку перегрузка оператора [] позволяет создавать безопасные массивы, которые выглядят и функционируют так же, как самые обычные массивы, их можно безболезненно добавить в вашу программную среду. Однако будьте внимательны. Безопасный массив увеличивает расход ресурсов, что не во всех ситуациях может оказаться приемлемым. Фактически, именно из-за непроизводительного расхода ресурсов в C++ отсутствует встроенный контроль границ массивов. Тем не менее, в тех приложениях, в которых желательно обеспечить целостность границ, реализация безопасного массива будет лучшим решением. УпраАненШ 1. Переделайте пример 1 из раздела 6.6 так, чтобы относительно класса strtype перегрузить оператор []. Этот оператор должен возвращать символ по заданному индексу. Кроме этого, необходима возможность задавать оператор [] в левой части инструкции присваивания. Покажите, что ваша программа работает. 2. Измените ваше решение упражнения 1 из раздела 6.6 так, чтобы оператор [] использовать для индексирования динамического массива. То есть замените функции get() и put() оператором []. Проверка1К№1я мшериало главы Теперь вам необходимо выполнить следующие упражнения и ответить на вопросы: 1. Перегрузите операторы сдвига и относительно класса coord так, чтобы стали возможными следующие типы операций: oW< integer ob integer Удостоверьтесь, что ваши операторы действительно сдвигают значения х и у на заданное количество разрядов. 2. Пусть дан класс clas ee d ( int х, у, z; public: threedtint i, int j, int k) : x = i;y = j;z = k; three d{) { x = 0; у = 0; г = 0; } void get (int si, int sj, int ik) i = x; j y; = z; Перегрузите для этого класса операторы +-, ++ и -. (Для операторов инкремента и декремента перегрузите только префиксную форму.) 3. Измените ваше решение вопроса 2 так, чтобы в оператор-функциях вместо параметров-значений использовать параметры-ссылки. (Подсказка. Для операторов инкремента и декремента вам потребуются дружественные функции.) 4. Чем действие дружественной оператор-функции отличается от действия оператор-функции - члена класса? 5. Объясните, почему может потребоваться перегрузка оператора присваивания. 6. Может ли функции tor=() быть дружественной? i 7. Перегрузите оператор + для класса e d из вопроса 2 так, чтобы иметь возможность выполнять следующие типы операций: ob + int; int + ob; 8. Перегрузите операторы ==, != и относительно класса ee d из вопроса 2. 9. Приведите главный довод в пользу перегрузки оператора Проверка усвоения материала в целом В этом разделе проверяется, хорошо ли вы усвоили материал этой и предыдущих глав. 1. Создайте класс strtype, который допускает следующие типы операций: Конкатенацию строк с помощью оператора + Присваивание строк с помощью оператора = Сравнение строк с помощью операторов <, > и== Можете пользоваться строками фиксированной длины. На первый взгляд это может показаться непростой задачей, но, немного подумав (и поэкспериментировав), вы должны справиться.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |