Архив категорий:C++

Крайне необычный способ разыменования итератора

Итераторы занимают важное место в разработке программ на С++. Но многие начинающие программисты совершенно не понимают, как ими пользоваться. И иногда рождают такой код, от которого волосы встают дыбом. Ниже приводится пример такого кода для задачи получения значения, на которое указывает итератор. Продолжить чтение →

Не создавайте пространство имён с именем linux

При разработке на С++ кроссплатформенного приложения разумно выделить платформо-зависимые части в отдельные пространства имён. Например, части, относящиеся только к операционным системам семейства Windows, в пространство имён windows. Это хорошая идея. Однако здесь есть крайне не очевидный подводный камень. Дело в том, что в компиляторе gcc нельзя создать пространство имён с именем linux. Продолжить чтение →

Итераторы не защищают от переполнения

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

std::vector при нехватке памяти

Контейнер std::vector представляет собой динамический массив, автоматически увеличивающийся в размере по мере надобности. Он описан в любом приличном руководстве по С++. Там же описываются его методы, достоинства и недостатки по сравнению с другими контейнерами.

В руководствах говорится, что при добавлении нового элемента может потребоваться выделение дополнительной памяти. Но ни одно из них (из тех, что я встречал) не дает ответа на вопрос: что произойдет, если выделить память не удастся? Память ведь не бесконечна. Продолжить чтение →

GCC требует открытого конструктора копирования для C++98

В одной из своих прошлых статей я рассказывал, что при возврате объектов GCC не использует конструктор копирования, сразу размещая объекты там, где они должны располагаться. Однако, в некоторых случаях GCC требует наличия открытого конструктора копирования. Продолжить чтение →

Не используйте std::move при возврате объектов

Конструкторы и операторы перемещения являются важным нововведением С++11. Про них много написано, и я не стану повторять основы. Вместо этого я хотел бы сосредоточиться на таком вопросе, как возвращение объектов. Нужно ли для этого использовать функцию std::move или нет? Продолжить чтение →

__cplusplus в разных компиляторах

Макрос __cplusplus изначально создавался для предоставления программистам возможности определения факта использования компилятора С++. Это было нужно для создания кода, который мог бы компилироваться как «новыми» (на то время) компиляторами С++, так и старыми для языка С. В частности он используется для отключения украшения имён (если нужно). Продолжить чтение →

Объявление переменных в конструкции case

Я всегда советую максимально ограничивать область видимости переменных. Это значительно упрощает сопровождение программы и предотвращает многие ошибки. Самый распространенный вариант такого ограничения — конструкция for. С ней обычно не возникает проблем. Сегодня же я хотел поговорить о конструкции switchcase Продолжить чтение →

Лишние скобки меняют тип переменной

Как дополнительные круглые скобки могут сказаться на типе переменной? Я, если честно, никогда не задумывался над этим. Нет, я конечно слышал про перегрузку оператора (), но сейчас не об этом. Несколько дней назад мое невнимательное отношение к круглым скобкам привело к ошибке, найти которую удалось не сразу. Продолжить чтение →