Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих.pdf
Скачиваний:
183
Добавлен:
01.05.2014
Размер:
3.97 Mб
Скачать

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

#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, то и операция инкремента выглядела бы вполне законно. Реализуйте эти операции для типа complex<double> и

#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,

int min( int ia, int ib )

если false, то expr3. Данный фрагмент кода:

{ 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> #include <iostream> #include <cstddef>

int main() { size_t ia;

ia

=

sizeof( ia

); //

правильно

ia

=

sizeof ia;

//

правильно

// ia = sizeof int; // ошибка ia = sizeof( int ); // правильно

int *pi = new int[ 12 ];

cout << "pi: " << sizeof( pi )

<<" *pi: " << sizeof( pi )

<<endl;

//sizeof строки не зависит от

//ее реальной длины

string stl( "foobar" ); string st2( "a mighty oak" );

string *ps = &stl;

cout << " st1: " << sizeof( st1 )

<<" st2: " << sizeof( st2 )

<<" ps: sizeof( ps )

<<" *ps: " << sizeof( *ps )

<<endl;

cout << "short :\t"

<< sizeof(short)

<<

endl;

<< sizeof(short*)

<<

cout << "shorf" :\t"

endl;

<< sizeof(short&)

<<

cout << "short& :\t"

endl;

cout << "short[3] :\t" << sizeof(short[3]) << endl;

}

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

pi: 4 *pi: 4

st1: 12 st2: 12 ps: 4 *ps:12 short : 2

short* : 4 short& : 2 short[3] : 6

Из данного примера видно, что применение sizeof к указателю позволяет узнать размер памяти, необходимой для хранения адреса. Если же аргументом sizeof является ссылка, мы получим размер связанного с ней объекта.

Гарантируется, что в любой реализации С++ размер типа char равен 1.