Программирование >>  Расширенная версия языка c++ 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 227


/лава 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, который допускает следующие типы операций:

Конкатенацию строк с помощью оператора +

Присваивание строк с помощью оператора =

Сравнение строк с помощью операторов <, > и==

Можете пользоваться строками фиксированной длины. На первый взгляд это может показаться непростой задачей, но, немного подумав (и поэкспериментировав), вы должны справиться.



1 ... 62 63 64 [ 65 ] 66 67 68 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика