|
Программирование >> Инициализация объектов класса, структура
оператор 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 в остальных. Для этого используем операцию сдвига:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |