Как стать автором
Обновить
287.39

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Многоликий const

Время на прочтение2 мин
Количество просмотров140K
Ключевое слово const — одно из самых многозначных в C++. Правильно использование const позволяет организовать множество проверок ещё на этапе компиляции и избежать многих ошибок из числа тех, которые бывает трудно найти при помощи отладчиков и/или анализа кода.

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

Читать дальше →

Безопасные конструкторы

Время на прочтение4 мин
Количество просмотров25K
Недавняя статья о порядке инициализации членов класса вызвала весьма любопытную дискуссию, в которой, среди прочих, обсуждался вопрос, как правильно оформлять члены класса, хранить ли их по значению и организовывать конструктор так:

A::A(int x) : b(x) {}

Или хранить их по ссылке:

A::A(int x) { b = new B(x); }

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

Читать дальше →

Порядок инициализации в конструкторах

Время на прочтение2 мин
Количество просмотров53K
Итак, вот небольшая программа на C++:

#include <iostream>

class A {
private:
  int a;
  int b;
public:
  A(int x) : b(x), a(b) {}
  void dump() {
    std::cout << "a=" << a << " b=" << b << std::endl;
  }
};

int main() {
  A a(42);
  a.dump();
  return 0;
}

Если вы считаете, что она выдаст

a=42 b=42

То вас ждёт сюрприз

Трюки со специализацией шаблонов C++

Время на прочтение4 мин
Количество просмотров110K
imageСпециализация шаблонов является одной из «сложных» фичей языка с++ и использутся в основном при создании библиотек. К сожалению, некоторые особенности специализации шаблонов не очень хорошо раскрыты в популярных книгах по этому языку. Более того, даже 53 страницы официального ISO стандарта языка, посвященные шаблонам, описывают интересные детали сумбурно, оставляя многое на «догадайтесь сами — это же очевидно». Под катом я постарался ясно изложить базовые принципы специализации шаблонов и показать как эти принципы можно использовать в построении магических заклинаний.

Ознакомиться с заклинаниями

Неожиданное коварство параметров по умолчанию или язык мой — враг мой

Время на прочтение3 мин
Количество просмотров12K
Хочется поделиться одним поучительным примером того, как, казалось бы, совершенно безобидная возможность языка программирования может обвести вокруг пальца даже опытного разработчика.

Вот пример кода. Вопрос традиционный, что напечатает программа? Постарайтесь скомпилировать и выполнить этот очень простой код «в уме», так будет интереснее.

#include <iostream>
using namespace std;

class A {
public:
    virtual void Foo (int n = 10) {
        cout << "A::Foo, n = " << n << endl;
    }
};

class B : public A {
public:
    virtual void Foo (int n = 20) {
        cout << "B::Foo, n = " << n << endl;
    }
};

int main() {
    A * pa = new B ();
    pa->Foo ();

    return 0;
}


Не заглядывайте в ответ! Ну что, определились? Смелее!
Посмотреть ответ

Как написать компонент к Firefox на C++

Время на прочтение5 мин
Количество просмотров3.6K
Как написать на C++ компонент для Firefox, так, чтобы его потом можно было использовать из яваскриптового extension или даже из обычной веб-страницы.
Вот как

Рисуем анимированные gif-ки с помощью libgd.

Время на прочтение2 мин
Количество просмотров20K
Смысл данной статьи — дать представление о использовании библиотеки GD в связке с С.

Скачать libgd или почитать более подробно о ее использовании можно здесь: http://www.libgd.org/(eng.)

После установки GD cписок функций и типы принимаемых/возвращаемых данных можно посмотреть в файлике /usr/local/include/gd.h (в моем случае, иначе sudo updatedb && locate gd.h) понять назначение функций довольно просто по их названию.

Код небольшой программки с моим описанием, которая рисует вотэто:

Image and video hosting by TinyPic

Смотрим под катом

Об операторах

Время на прочтение1 мин
Количество просмотров1K
Задумался тут над вопросом. В языке Си для операторов && и || определен порядок вычисления операндов. Более того, если левый операнд вернул ложь для && или истину для ||, то правый вычисляться уже не будет. Это позволяет использовать конструкции по типу «smth or die», которые сплошь и рядом можно встретить в скриптовых языках:
(f = fopen("file", "r")) || fprintf(stderr, "Can not open file\n");
Вы когда нибудь видели такой код на Си? Я нет. Вот интересно почему :) Предвидя ответы «слишком длинно», «некрасиво» и т.п.: тогда почему же в скриптовых языках оно так распространено?

rethink their coding style…

Время на прочтение1 мин
Количество просмотров15K
Выдержка из исходников gcc, файл libcpp/files.c

Copy Source | Copy HTML
  1. /* off_t might have a wider range than ssize_t - in other words,
  2. the max size of a file might be bigger than the address
  3. space. We can't handle a file that large. (Anyone with
  4. a single source file bigger than 2GB needs to rethink
  5. their coding style.) Some systems (e.g. AIX 4.1) define
  6. SSIZE_MAX to be much smaller than the actual range of the
  7. type. Use INTTYPE_MAXIMUM unconditionally to ensure this
  8. does not bite us. */
  9.    if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
  10.    {
  11.       cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
  12.       return false;
  13.    }
  14.  
  15.       size = file->st.st_size;

Visual Studio 2008 Win32 Wizard MOD

Время на прочтение2 мин
Количество просмотров4.1K
Мне всегда не нравились параметры по умолчанию, которые устанавливала Visual Studio при создании приложений для Win32. Каждый раз при создании нового проекта (даже самого мизерного) приходилось каждый раз отключать Unicode, Precompiled Headers (в небольших программах это ни к чему), включать статическую линковку всех необходимых библиотек для Release версии. Хотелось лишить себя этих хлопот.
Данный мод изменяет работу окна создания стандартных Win32 приложений в Visual Studio 2008. Настройки по умолчанию изменены на более удобные для небольших проектов, добавлены новые опции.
Читать дальше →

C++ MythBusters. Миф о виртуальных функциях (дополнение)

Время на прочтение4 мин
Количество просмотров15K

Преамбула


Добрый вечер (ну, или кому чего).

Не так давно наткнулся на хабре на статью о виртуальных функциях в С++ (она находится сейчас тут). Был бы рад добавить комментарий, но, как оказалось, тут надо иметь регистрацию. Собственно поэтому я и написал этот пост-дополнение к вышеуказанной статье.

В данной статье я хочу затронуть вопрос виртуальности конструкторов, деструкторов, а также специфичные вопросы, так или иначе связанные с виртуальностью функций.

Статья расчитана на программистов средней и высокой квалификации. Приятного чтения.
Читать дальше →

C++ MythBusters. Миф о виртуальных функциях

Время на прочтение9 мин
Количество просмотров83K
Здравствуйте.

В прошлой статье я рассказывал, с какой не всем известной особенностью можно столкнуться при работе с подставляемыми функциями. Статья породила как несколько существенных замечаний, так и многостраничные споры (и даже холивары), начавшиеся с того, что inline-функции вообще лучше не использовать, и перешедшие в стандартную тему C vs. C++ vs. Java vs. C# vs. PHP vs. Haskell vs. …

Сегодня пришла очередь виртуальных функций.
Читать дальше

Создаём парсер для ini-файлов на C++

Время на прочтение7 мин
Количество просмотров40K
В данной статье я расскажу как написать свой парсер ini-файлов на C++. За основу возьмём контекстно-свободную грамматику, построенную в моей предыдущей статье. Для построения парсера будет использоваться библиотека Boost Spirit, которая позволяет строить свои собственные парсеры комбинируя готовые примитивные парсеры при помощи парсерных комбинаторов.

Важно: в данной статье предполагается, что читатель знаком с основами C++ (в том числе будет активно использоваться STL). Если вы не очень в себе уверены, то я советую сначала прочитать пару статей для новичков по С++ и по STL.
Читать дальше →

Ближайшие события

Реальны ли высокопроизводительные Web-приложения на C++?

Время на прочтение1 мин
Количество просмотров4.4K
В данный момент стоит вопрос о разработке высокопроизводительного веб-приложения, которое могло бы выдерживать миллионы хитов в день.
Целевая нагрузка от 1000 хитов в секунду и выше (вплоть до заполнения гигабитного канала).

Имел ли кто-либо из читателей опыт разработки веб-приложений на С++? Предлагаю обсудить сложности и ограничения.
Подразумевается что приложение не будет иметь утечек памяти(и соответственно проблем со стабильностью), и 2-3-х кратное увеличение цены разработки по сравнению с PHP приемлимо.

Какие варианты вижу я:
Читать дальше →

C++ MythBusters. Миф о подставляемых функциях

Время на прочтение5 мин
Количество просмотров37K
Здравствуйте.

Благодаря вот этому голосованию выяснилось, что на Хабре не хватает статей по такому мощному, но всё менее используемому языку C++. Профессионалам высокого уровня, гуру, магам и волшебникам языка C++, а также тем, кто уже успел оставить этот язык «позади» можно дальше не читать. Сегодня я хочу начать цикл статей, призванных помочь именно новичкам, относительно недавно начавшим изучать этот язык, либо же тем, кто (упаси Боже) читает мало книг, а пытается познавать всё исключительно на практике.

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

Читать дальше

Задачка "Hello World"

Время на прочтение1 мин
Количество просмотров6.9K
Итак, вопрос знатокам: Сколько раз на экране появится заветная фраза при выполнении этой программы?

#include <iostream>
int main(int argc, char* argv[])
{
   int i = 10;
   std::cout<<"Hello World!"<<std::endl;
   // Сколько раз???
   while(i--)
   {
      // Сколько раз будет вызвана эта строка???/
      for(int j=0; j<10; j++)
         std::cout<<"Hello World!"<<std::endl;
   }
   return 0;
}
Читать дальше →

Фридрих Энгельс и язык программирования С++

Время на прочтение2 мин
Количество просмотров1.3K
Не так давно я вспоминал старые времена в статье «История одного программиста или путь от простого до точки» (части первая и вторая). По мере написания вспоминались многие забавные и не очень вещи, которые случались в прошлом. Об одной из таких вещей я и хотел рассказать.

Казалось бы, какая связь может быть между Фридрихом Энгельсом и языком С++. Я тоже и подумать не мог что такая связь минимальная, микроскопическая, но в нашем огромном мире все-таки существует. Чтобы узнать больше — проследуйте под кат. Но предупреждаю, под катом десяток ссылок на фотографии.
Читать дальше →

How Non-Member Functions Improve Encapsulation (C++)

Время на прочтение2 мин
Количество просмотров1.6K
Листал старые журналы и наткнулся на широко известную в узких кругах статью Scott Meyers: How non-member functions improve encapsulation. Если кто-то ее еще не читал — прочитайте обязательно.
Мысль там излагается понятная и верная, но все же по-моему в статье есть большая недосказанность.
Говоря кратко, в этой статье Мейерс утверждает, что вынесение функций из класса всегда делает код более инкапсулированным.
Читать дальше →

Использование общего C++ кода на примере браузера Chrome

Время на прочтение1 мин
Количество просмотров7.6K
Думаю ни для кого не секрет, что новый браузер от Google — это open-source продукт, написанный на C++. Каждый может скачать его исходники на C++ и собрать свой собственный браузер из них.
А сегодня мне встретилась интересная статья Code Reuse in Google Chrome Browser. Там автор проанализировал использование общего open-source кода в этом проекте Google и нашел его превосходным. Он обнаружил как минимум 26 разных библиотек, используемых в этом проекте и описал их все в одной таблице…
Я решил сначала перевести эту таблицу на русский, т.к. она может быть полезна всем разработчикам на C++ — там много реально полезных open-source библиотек. Но эта таблица настолько проста, что перевод был бы бессмысленным — каждый сам легко разберется.
Многие из этих библиотек будут полезны не только Web-разработчикам.

А сколько open-source библиотек используется в ваших проектах? И каково отношение руководство к open-source?
На предыдущем месте работы мы использовали несколько таких библиотек — zlib, LuaPlus, TinyXml, CppUnit, библиотеки для работы с графикой (типа libpng ) и т.п.
А на новой работе отношение к open-source отрицательное и почти ничто из open-source не используется — все пишется свое с нуля.

C++‭ ‬2009

Время на прочтение13 мин
Количество просмотров6.3K
«Самая важная вещь в языке программирования - его имя. 
Язык не будет иметь успеха без хорошего имени. 
Я недавно придумал очень хорошее имя, 
теперь осталось изобрести подходящий язык.»  
Д. Э. Кнут  


Эволюция C++09: флешбек



После первой спецификации C++, ратифицированной в 1998 году, был взят пятилетний перерыв, который позволил разработчикам компиляторов подстроиться под стандарт. Также такое время «радиомолчания» позволило Комитету получить отзывы относительно документа. В конце этого периода комитет стандартов ANSI выпустил обновлённую спецификацию, содержащую исправления и различного рода улучшения. Эти исправления были задокументированы в первом техническом списке ошибок от 2003 года.

Читать дальше →