|
Программирование >> Инициализация объектов класса, структура
правильно int ix vec = -1, ix ia = 8; while ( ix vec < 10 ) скорректировать начальные значения переменных ix ivec и ix ia: ivec[ ++ix vec ] = ia[ --ix ia ]; В качестве последнего примера рассмотрим понятие стека. Это фундаментальная абстракция компьютерного мира, позволяющая помещать и извлекать элементы в последовательности LIFO (last in, fist out - последним вошел, первым в1шел). Стек реализует две основные операции - поместить (push) и извлечь (pop). Текущий свободный элемент называют вершиной стека. Операция push присваивает этому элементу новое значение , после чего вершина смещается вверх (становится на 1 больше). Пусть наш стек использует для хранения элементов вектор. Какую из форм операции увеличения следует применить? Сначала мы используем текущее значение, потом увеличиваем его. Это постфиксная форма: stack[ top++ ] = value; Что делает операция pop? Уменьшает значение вершины (текущая вершина показывает на пустой элемент), затем извлекает значение. Это префиксная форма операции уменьшения: int value = stack[ --top ]; (Реализация класса stack приведена в конце этой главы. Стандартный класс stack рассматривается в разделе 6.16.) Упражнение 4.8 Как вы думаете, почему язык программирования получил название С++, а не ++С? 4.6. Операции с комплексными числами Класс комплексных чисел стандартной библиотеки С++ представляет собой хороший пример использования объектной модели. Благодаря перегруженным арифметическим операциям объекты этого класса используются так, как будто они принадлежат одному из встроенных типов данных. Более того, в подобных операциях могут одновременно принимать участие и переменные встроенного арифметического типа, и комплексные числа. (Отметим, что здесь мы не рассматриваем общие вопросы математики комплексных чисел. См. [PERSON68] или любую книгу но математике.) Например, можно написать: ivec[ ++ix vec ] = ia[ --ix ia ]; значение ix vec увеличивается на единицу и становится равным 1 до первого использования в качестве индекса. Аналогично ix ia получает значение 8 при первом использовании. Для того чтобы наша программа работала правильно, мы должны int ival = 3; Или complex obj = ival; Однако обратное неверно. Например, следующее выражение вызовет ошибку ошибка: нет неявного преобразования в арифметический тип компиляции: double dval = complex obj; Нужно явно указать, какую часть комплексного числа - вещественную или мнимую - мы хотим присвоить обычному числу. Класс комплексных чисел имеет две функции, возвращающих соответственно вещественную и мнимую части. Мы можем обращаться к double re = complex obj.real(); ним, используя синтаксис доступа к членам класса: double im = complex obj.imag(); double re = real(complex obj); или эквивалентный синтаксис вызова функции: #inc1ude <complex> comp1ex< double > a; comp1ex< double > b; ... complex< double > с = a * b + a / b; Комплексные и арифметические типы разрешается смешивать в одном выражении: complex< double > complex obj = a + 3.14159; Аналогично комплексные числа инициализируются арифметическим типом, и им может double dval = 3.14159; быть присвоено такое значение: complex obj = dval; ( 3.14159, -2.171 ) ( 3.14159, 0.0 ) допустимхе форматы для ввода комплексного числа 3.14159 ==> comp1ex( 3.14159 ); ( 3.14159 ) ==> comp1ex( 3.14159 ); ( 3.14, -1.0 ) ==> comp1ex( 3.14, -1.0 ); может быть считано как cin >> a >> b >> с где a, b, с - комплексные числа Оператор ввода понимает любой из следующих форматов: 3.14159 ( 3.14159 ) ( 3.14, -1.0 ) Кроме этих операций, класс комплексных чисел имеет следующие функции-члены: sqrt(), abs (), polar(), sin(), cos(), tan (), exp(), log (), log10() и pow (). Упражнение 4.9 Реализация стандартной библиотеки С++, доступная нам в момент написания книги, не поддерживает составных операций присваивания, если правый операнд не является комплексным числом. Например, подобная запись недопустима: complex obj += 1; (Хотя согласно стандарту С++ такое выражение должно быть корректно, производители часто не успевают за стандартом.) Mы можем определить свой собственный оператор для реализации такой операции. Вот вариант функции, реализующий оператор сложения для complex<double>: double im = imag(complex obj); Класс комплексных чисел поддерживает четыре составных оператора присваивания: +=, -=, *= и /=. Таким образом, complex obj += second complex obj; Поддерживается и ввод/вывод комплексных чисел. Оператор вывода печатает вещественную и мнимую части через запятую, в круглых скобках. Например, результат complex< double > complex0( 3.14159, -2.171 ); comp1ex< double > complex1( complexO.real() ); выполнения операторов вывода cout << complexO << << complex1 << endl; выглядит так:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |