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

1 ... 50 51 52 [ 53 ] 54 55 56 ... 395


оператор delete к указателю, не содержащему адрес объекта, полученного описанным способом, вызовет ошибку времени выполнения.) Например:

delete pi;

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

delete ps;

освобождает память, на которую указывает объект класса string, адрес которого содержится в ps. Перед уничтожением этого объекта вызывается деструктор. Выражение

delete [] pia;

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

(Об операциях new и delete м1 еще поговорим в главе 8.)

Упражнение 4.11

Какие из следующих выражений ошибочны?

(a) vector<string> svec( 10 );

(b) vector<string> *pvecl = new vector<string>(10);

(c) vector<string> **pvec2 = new vector<string>[10];

(d) vector<string> *pvl = ssvec;

(e) vector<string> *pv2 = pvecl;

(f) delete svec;

(g) delete pvecl;

(h) delete [] pvec2;

(i) delete pvl; (j) delete pv2;

4.10. Оператор запятая

Одно выражение может состоять из набора подвыражений, разделенн1х запятыми; такие подвыражения вычисляются слева направо. Конечным результатом будет результат самого правого из них. В следующем примере каждое из подвыражений условного оператора представляет собой список. Результатом первого подвыражения условного оператора является ix, второго - 0.



int main()

примеры оператора запятая

переменные ia, sz и index определены в другом месте

int ival = (ia != 0)

? ix=get va1ue(), ia[index]=ix : ia=new int[sz], ia[index]=0;

4.11. Побитовые операторы

Таблица 4.3. Побитовые операторы

Символ операции

&

Значение

Побитовое НЕ Сдвиг влево Сдвиг вправо Побитовое И Побитовое

ИСКЛЮЧАЮЩЕЕ ИЛИ

Побитовое ИЛИ

Побитовое И с

присваиванием

Побитовое

ИСКЛЮЧАЮЩЕЕ ИЛИ с

присваиванием

Побитовое ИЛИ с присваиванием

Сдвиг влево с

присваиванием

Сдвиг вправо с

присваиванием

Использование

~expr

expr1 << expr2 expr1 >> expr2 expr1 & expr2 expr1 expr2

expr1 expr2 expr1 &= expr2

expr1 = expr2

expr1 = expr2 expr1 <<= expr2 expr1 >>= expr2

Побитовые операции рассматривают операнды как упорядоченные наборы битов, каждый бит может иметь одно из двух значений - 0 или 1. Такие операции позволяют программисту манипулировать значениями отдельных битов. Объект, содержащий набор битов, иногда называют битовым вектором. Он позволяет компактно хранить набор флагов - неременных, принимающих значение да нет . Например, компиляторы зачастую помещают в битовые векторы спецификаторы типов, такие, как const и volatile. Библиотека iostream использует эти векторы для хранения состояния формата вывода.

Как мы видели, в С++ существуют два способа работы со строками: использование C-строк и объектов типа string стандартной библиотеки - и два подхода к массивам: массивы встроенного типа и объект vector. При работе с битовыми векторами также

<<=



можно применять подход, заимствованный из С, - использовать для представления такого вектора объект встроенного целого типа, обычно unsigned int, или класс bitset стандартной библиотеки С++. Этот класс инкапсулирует семантику вектора, предоставляя операции для манипулирования отдельными битами. Кроме того, он позволяет ответить на вопросы типа: есть ли взведенные биты (со значением 1) в векторе? Сколько битов взведено ?

В общем случае предпочтительнее пользоваться классом bitset, однако, понимание работы с битовыми векторами на уровне встроенных типов данных очень полезно. В этом разделе мы рассмотрим применение встроенных типов для представления битовых векторов, а в следующем - класс bitset.

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

Побитовое НЕ (~) меняет значение каждого бита операнда. Бит, установленный в 1, меняет значение на 0 и наоборот.

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

Побитовое И (s) применяет операцию И ко всем битам своих операндов. Каждый бит левого операнда сравнивается с битом правого, находящимся в той же позиции. Если оба бита равны 1 , то бит в данной позиции получает значение 1, в любом другом случае - 0. (Побитовое И (s) не надо путать с логическим И (ss),но, к сожалению, кажд1й программист хоть раз в жизни совершал подобную ошибку.)

Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ () сравнивает бит1 операндов. Соответствующий бит результата равен 1, если операнды различны (один равен 0, а другой 1). Если же оба операнда равны, результата равен 0.

Побитовое ИЛИ () применяет операцию логического сложения к каждому биту операндов. Бит в позиции результата получает значение 1, если хотя бы один из соответствующих битов операндов равен 1, и 0, если биты обоих операндов равны 0. (Побитовое ИЛИ не нужно смешивать с логическим ИЛИ.)

Рассмотрим простой пример. Пусть у нас есть класс из 30 студентов. Каждую неделю преподаватель проводит зачет, результат которого - сдал/не сдал. Итоги можно представить в виде битового вектора. (Заметим, что нумерация битов начинается с нуля, первый бит на самом деле является вторым по счету. Однако для удобства мы не будем использовать нулевой бит; таким образом, студенту номер 1 соответствует бит номер 1. В конце концов, наш преподаватель - не специалист в области программирования.)

unsigned int iz1 = 0;

Нам нужно иметь возможность менять значение каждого бита и проверять это значение. Предположим, студент 27 сдал зачет. Бит 27 необходимо выставить в 1, не меняя значения других битов. Это можно сделать за два шага. Сначала нужно начать с числа, содержащего 1 в 27-м бите и 0 в остальных. Для этого используем операцию сдвига:



1 ... 50 51 52 [ 53 ] 54 55 56 ... 395

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