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;
}
Стандарт С++ не специфицирует реализацию операций инкремента и декремента для комплексного числа. Однако их семантика вполне понятна: если уж мы можем написать:
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