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

1 ... 33 34 35 [ 36 ] 37 38 39 ... 395


bool found = false; int occurrence count = 0;

while ( /* mumble */ ) {

found = look for( /* something */ );

значение found преобразуется в 0 или 1 occurrence count += found;

false - в 0. Например:

Таким же образом значения целых типов и указателей могут быть преобразованы в

возвращает количество вхождений extern int find( const stringS ); bool found = false; if ( found = find( rosebud )) правильно: found == true

возвращает указатель на элемент extern int* find( int value );

if ( found = find( 1024 ))

значения тина bool. При этом 0 интерпретируется как false, а все остальное как true:

правильно: found == true

3.8. Перечисления

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

const int input = 1; const int output = 2;

const int

Конечно, можно определить три константы для обозначения этих режимов:

const int append = 3;

и пользоваться этими константами:

i ошибка short bool found = false;

Объекты тина bool неявно преобразуются в тин int. Значение true превращается в 1, а



bool open file( string file name, int open mode);

...

open file( Phoenix and the Crane , append );

Подобное решение допустимо, но не вполне приемлемо, поскольку мы не можем гарантировать, что аргумент, передаваемый в функцию open file() равен только 1, 2 или 3.

Использование перечислимого типа решает данную проблему. Когда мы пишем: enum open modes{ input = 1, output, append };

мы определяем новый тип open modes. Допустимые значения для объекта этого типа ограничены набором 1, 2 и 3, причем каждое из указанных значений имеет мнемоническое имя. Мы можем использовать имя этого нового типа для определения как объекта данного типа, так и типа формальных параметров функции:

void open file( string file name, open modes om );

input, output и append являются элементами перечисления. Набор элементов перечисления задает допустимое множество значений для объекта данного типа. Переменная типа open modes (в нашем примере) инициализируется одним из этих значений, ей также может быть присвоено любое из них. Например:

open file( Phoenix and the Crane , append );

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

ошибка: 1 не является элементом перечисления open modes

перечисления, мы все равно получим ошибку:

open file( Jonah , 1 ); Есть способ определить переменную типа open modes, присвоить ей значение одного из

open modes om = input;

...

элементов перечисления и передать параметром в функцию:

om = append;

open file( TailTell , om );

Однако получить имена таких элементов невозможно. Если мы напишем оператор вывода:

cout << input << << om << endl; то все равно получим:



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

cout << open modes table[ input ] <<

такой массив, мы сможем написать:

<< open modes table[ om ] << endl Будет выведено:

i input append

не поддерживается

for ( open modes iter = input; iter != append; ++inter )

Кроме того, нельзя перебрать все значения перечисления: ...

Для определения перечисления служит ключевое слово enum, а имена элементов задаются в фигурных скобках, через запятую. По умолчанию первый из них равен 0, следующий -1 и так далее. С помощью оператора присваивания это правило можно изменить. При этом каждый следующий элемент без явно указанного значения будет на 1 больше, чем элемент, идущий перед ним в списке. В нашем примере м1 явно указали значение 1 для

shape == 0, sphere == 1, cylinder == 2, polygon == 3

input, при этом output и append будут равны 2 и 3. Вот еще один пример:

enum Forms{ share, spere, cylinder, polygon };

Целые значения, соответствующие разным элементам одного перечисления, не обязаны

point2d == 2, point2w == 3, point3d == 3, point3w == 4

отличаться. Например:

enum Points { point2d=2, point2w, point3d=3, point3w=4 };

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



1 ... 33 34 35 [ 36 ] 37 38 39 ... 395

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