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

1 ... 38 39 40 [ 41 ] 42 43 44 ... 395


чисто 1лнимое число: 0 + 7-i comp1ex< double > purei( 0, 7 );

/ / 1лнимая часть равна 0: 3 + Oi comp1ex< float > rea1 num( 3 );

и вещественная, и мнимая часть равных 0: 0 + 0-i comp1ex< long double > zero;

/ / инициазация одного комплексного числа другим complex:

comp1ex< double > purei2( purei );

Поскольку complex, как и vector, является шаблоном, мы можем конкретизировать его типами float, double и long double, как в приведенных примерах. Можно также

complex< double > conjugate[ 2 ] = { complex< double >( 2, 3 ), complex< double >( 2, -3 )

определить массив элементов типа complex:

complex< double > *ptr = &conjugate[0];

Вот как определяются указатель и ссылка на комплексное число:

complex< double > &ref = *ptr;

Комплексные числа можно складывать, вычитать, умножать, делить, сравнивать, получать значения вещественной и мнимой части. (Более подробно м1 будем говорить о классе complex в разделе 4.6.)

3.12. Директива typedef

Директива typedef позволяет задать синоним для встроенного либо пользовательского типа данных. Например:

#include <comp1ex>

Комплексное число состоит из двух частей - вещественной и мнимой. Мнимая часть представляет собой квадратный корень из отрицательного числа. Комплексное число принято записывать в виде

2 + 3i

где 2 - действительная часть, а 3i - мнимая. Вот примеры определений объектов типа



typedef double wages;

typedef vector<int> vec int; typedef vec int test scores;

typedef bool in attendance;

typedef int *Pint;

Имена, определенные с помощью директивы typedef, можно использовать точно так же,

double hourly, weekly; wages hourly, weekly;

hourly,

vector<int> vecl( 10 ); vec int vecl( 10 );

vector<int> test0( c1ass size ); const int c1ass size = 34; test scores test0( c1ass size );

vector< bool > attendance;

vector< in attendance > attendance( c1ass size );

int *table[ 10 ];

как спецификаторы типов:

Pint table [ 10 ];

Эта директива начинается с ключевого слова typedef, за которым идет спецификатор типа, и заканчивается идентификатором, который становится синонимом для указанного типа.

Для чего используются имена, определенные с помощью директивы typedef? Применяя мнемонические имена для типов данных, можно сделать программу более легкой для восприятия. Кроме того, принято употреблять такие имена для сложных составных типов, в противном случае воснринимаем1х с трудом (см. пример в разделе 3.14), для объявления указателей на функции и функции-члены класса (см. раздел 13.6).

Ниже приводится пример вопроса, на который почти все дают неверный ответ. Ошибка вызвана непониманием директивы typedef как простой текстовой макроподстановки. Дано определение:

typedef char *cstring; Каков тип переменной cstr в следующем объявлении:

extern const cstring cstr;

Ответ, который кажется очевидным:

const char *cstr

Однако это неверно. Спецификатор const относится к cstr, поэтому правильный ответ -константный указатель на char:

char *const cstr;



volatile int disp1ay register; volatile Task *curr task; volatile int ixa[ max size ];

Спецификатор volatile используется подобно спецификатору const:

volatile Screen bitmap buf;

display register - неустойчивый объект типа int. curr task - указатель на неустойчивый объект класса Task. ixa - неустойчивый массив целых, причем каждый элемент такого массива считается неустойчивым. bitmap buf - неустойчивый объект класса Screen, каждый его член данных также считается неустойчивым.

Единственная цель использования спецификатора volatile - сообщить компилятору, что тот не может определить, кто и как может изменить значение данного объекта. Поэтому компилятор не должен выполнять оптимизацию кода, использующего данный объект.

3.14. Класс pair

Класс pair (пара) стандартной библиотеки С++ позволяет нам определить одним объектом пару значений, если между ними есть какая-либо семантическая связь. Эти значения могут быть одинакового или разного типа. Для использования данного класса необходимо включить заголовочный файл:

#inc1ude <uti1ity> Например, инструкция

pair< string, string > author( James , Joyce );

создает объект author типа pair, состоящий из двух строковых значений.

string firstBook; if

( Joyce.first == James && Joyce.second == Joyce )

Отдельные части пары могут быть получены с помощью членов first и second:

firstBook = Stephen Hero ;

Если нужно определить несколько однотипных объектов этого класса, удобно использовать директиву typedef:

3.13. Спецификатор volatile

Объект объявляется как volatile (неустойчивый, асинхронно изменяемый), если его значение может быть изменено незаметно для компилятора, например переменная, обновляемая значением системных часов. Этот спецификатор сообщает компилятору, что не нужно производить оптимизацию кода для работы с данным объектом.



1 ... 38 39 40 [ 41 ] 42 43 44 ... 395

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