Программирование >>  Инициализация объектов класса, структура 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 395


правильно

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;

выглядит так:



1 ... 47 48 49 [ 50 ] 51 52 53 ... 395

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