Выбрать главу

complex_obj += 1;

(Хотя согласно стандарту С++ такое выражение должно быть корректно, производители часто не успевают за стандартом.) Мы можем определить свой собственный оператор для реализации такой операции. Вот вариант функции, реализующий оператор сложения для complexdouble:

#include complex

operator+=( complexdouble cval, double dval )

{

return cval += complexdouble( dval );

}

(Это пример перегрузки оператора для определенного типа данных, детально рассмотренной в главе 15.)

Используя этот пример, реализуйте три других составных оператора присваивания для типа complexdouble. Добавьте свою реализацию к программе, приведенной ниже, и запустите ее для проверки.

#include iostream

#include complex

// определения операций...

int main() {

complex double cval ( 4.0, 1.0 );

cout cval endl;

cval += 1;

cout cval endl;

cval -= 1;

cout cval endl;

cval *= 2;

cout cval endl;

cout /= 2;

cout cval endl;

}

Упражнение 4.10

Стандарт С++ не специфицирует реализацию операций инкремента и декремента для комплексного числа. Однако их семантика вполне понятна: если уж мы можем написать:

cval += 1;

что означает увеличение на 1 вещественной части cval, то и операция инкремента выглядела бы вполне законно. Реализуйте эти операции для типа complexdouble и выполните следующую программу:

#include iostream

#include complex

// определения операций...

int main() {

complex double cval( 4.0, 1.0 );

cout cval endl;

++cva1;

cout cval endl;

}

4.7. Условное выражение

Условное выражение, или оператор выбора, предоставляет возможность более компактной записи текстов, включающих инструкцию if-else. Например, вместо:

bool is_equal;

if (!strcmp(str1,str2)) is_equal = true;

else is_equal = false;

можно употребить более компактную запись:

bool is_equa1 = !strcmp( strl, str2 ) ? true : false;

Условный оператор имеет следующий синтаксис:

expr11 ? expr2 : expr3;

Вычисляется выражение expr1. Если его значением является true, оценивается expr2, если false, то expr3. Данный фрагмент кода:

int min( int ia, int ib )

{ return ( ia ib ) ? ia : ib; }

эквивалентен

int min(int ia, int ib) {

if (ia ib)

return ia;

else

return ib;

}

Приведенная ниже программа иллюстрирует использование условного оператора:

#include iostream

int main()

{

int i = 10, j = 20, k = 30;

cout "Большим из "

i " и " j " является "

( i j ? i : j ) end1;

cout "Значение " i

( i % 2 ? " нечетно." : " четно." )

endl;

/* условный оператор может быть вложенным,

* но глубокая вложенность трудна для восприятия.

* В данном примере max получает значение

* максимальной из трех величин

*/

int max = ( (i j)

? (( i k) ? i : k)

: ( j k ) ? j : k);

cout "Большим из "

i ", " j " и " k

" является " max endl;

}

Результатом работы программы будет:

Большим из 10 и 20 является 20

Значение 10 четно.

4.8. Оператор sizeof

Оператор sizeof возвращает размер в байтах объекта или типа данных. Синтаксис его таков:

sizeof ( type name );

sizeof ( object );

sizeof object;

Результат имеет специальный тип size_t, который определен как typedef в заголовочном файле cstddef. Вот пример использования обеих форм оператора sizeof:

#include cstddef

int ia[] = { 0, 1, 2 };

// sizeof возвращает размер всего массива

size_t array_size = sizeof ia;

// sizeof возвращает размер типа int

size_t element_size = array_size / sizeof( int );

Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них. Так, например, в системах, где int хранится в 4 байтах, значением array_size будет 12. Применение sizeof к указателю дает размер самого указателя, а не объекта, на который он указывает:

int *pi = new int[ 3 ];

size_t pointer_size = sizeof ( pi );

Здесь значением pointer_size будет память под указатель в байтах (4 в 32-битных системах), а не массива ia.

Вот пример программы, использующей оператор sizeof:

#include string