Как стать автором
Поиск
Написать публикацию
Обновить
125.59

C++ *

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

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

Boost это просто. Часть 2. Boost.Date_time

Время на прочтение15 мин
Количество просмотров39K
Как вы уже поняли, в данной статье речь пойдет о библиотеке Boost.Date_Time. Библиотеке по работе со временем.
 
 
 

В статье мы рассмотрим следующие части библиотеки:

  • Gregorian
  • Posix Time
  • Local Time


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

Один символ ценой в уязвимость

Время на прочтение1 мин
Количество просмотров1.7K
Возможно, многие в курсе про недавнюю узявимость в ActiveX компоненте MSVidCtl, которая потенциально могла позволить злоумышленнику выполнить произвольный код используя переполнение буфера. Недавно, в блоге посвященному практике SDL появилось описание ошибки программиста, которая привела к уязвимости защиты.

Ошибка заключается в одном символе, вместо правильного кода:
hr = pStream->Read((void*)pbArray, (ULONG)cbSize, NULL);
* This source code was highlighted with Source Code Highlighter.

программист написал
hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);
* This source code was highlighted with Source Code Highlighter.

использование лишнего символа & (получение адреса) привело к тому, что злоумышленник получил возможность произвести удаленное переполнение буфера с известными последствиями.

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

C++0x (С++11). Лямбда-выражения

Время на прочтение13 мин
Количество просмотров307K
Буквально на днях случайно наткнулся на Хабре на статью о лямбда-выражениях из нового (будущего) стандарта C++. Статья хорошая и даёт понять преимущества лямбда-выражений, однако, мне показалось, что статья недостаточно полная, поэтому я решил попробовать более детально изложить материал.

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

Лямбда выражения теперь и в С++

Время на прочтение3 мин
Количество просмотров43K
image
Многие языки программирования позволяют создавать налету локальные не именованные функции внутри выражений. К этим языкам относятся C#3.0, Python, ECMAScript и практически все функциональные языки программирования (например, Haskell и Scheme). Такие функции обычно относят к лямбда функциям, которые имеют широкое применение.
Читать дальше →

Виртуальный конструктор

Время на прочтение6 мин
Количество просмотров67K
Все мы знаем, что в C++ нет такого понятия как виртуальный конструктор, который бы собирал нужный нам объект в зависимости от каких-либо входных параметров на этапе выполнения. Обычно для этих целей используется параметризованный фабричный метод (Factory Method). Однако мы можем сделать «ход конем» и сымитировать поведение виртуального конструктора с помощью методики, называемой «конверт и письмо» («Letter/Envelope»).

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

Виртуальные функции и деструктор

Время на прочтение6 мин
Количество просмотров179K
Когда-то давным давно я собирался и даже обещал написать про механизм виртуальных функций относительно деструкторов. Теперь у меня наконец появилось свободное время и я решил воплотить эту затею в жизнь. На самом деле эта мини-статья служит «прологом» к моей следующей статье. Но я постарался изложить доходчиво и понятно основные моменты по текущей теме. Если вы чувствуете, что еще недостаточно разобрались в механизме виртуальных вызовов, то, возможно, вам следует для начала прочитать мою предыдущую статью.

Сразу же, как обычно, оговорюсь, что: 1) статья моя не претендует на полноту изложения материала; 2) мегапрограммеры ничего нового здесь не узнают; 3) материал не новый и давно описан во многих книгах, но если явно об этом не прочитать и самому специально не задумываться, то можно о некоторых моментах даже не подозревать (до поры, до времени). Также прошу прощения за надуманные примеры :)

Все-таки интересно?

Boost это просто. Часть 1. Boost.Regex

Время на прочтение10 мин
Количество просмотров81K
Эта статья является первой в цикле статей, которые я собираюсь посвятить, наверное лучшей, библиотеке для С++.
В данной статье рассматриваются следующие вопросы касательно регулярных выражений:
  • regex_match
  • regex_search
  • regex_replace
  • regex_iterator
  • regex_token_iterator
  • Partial match

Начнем

3 in 1: Desktop, Mobile, Web. Кроссплатформенная разработка

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

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

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

Ну да, сайты на C++

Время на прочтение4 мин
Количество просмотров35K
Проскочила пара топиков про веб на C++ и уж много товарищей недопонимают смысл использования C++ в вебе. Поэтому расскажу как я в своем опыте использовал это. Я использовал, правда, Python, но только потому что библиотеки типа WebToolKit не было под рукой.

Если честно, я в C++ разбираюсь как хакер в женских помадах — как и многие, я большей частью использую PHP (и все больше Python, но его редко для веба — больше для OpenGL), но тем не менее это не мешает мне его(C++) использовать. Это к тому, что не пугайтесь сложности языка — там не все так плохо, как кажется.

Но, что важно: «Premature optimization is the root of all evil». И это важно. Писать какую-нибудь сложную систему сразу на C++ бессмысленно (я про сайты, конечно). Оптимизировать, как правило, нужно только 3% кода. Вот про эти 3 процента я и расскажу.

Был у меня сайт и на нем на всех страницах пользователи могли кое-чего кое-куда писать (долго объяснять) и в уголке шел «поток» в реальном времени (через AJAX update каждые 5 секунд) кто куда и чего написал. Делалось, как и положено на PHP/MySQL — таблица, в ней выбираем последние (условно говоря: WHERE id>MAX(id)-10 ORDER BY id DESC) записи. Периодически удаляем все, кроме последних десяти. Работало замечательно. Пока TechCrunch про сайт не написал. Сдох сервер из-за этой части.
Читать дальше →

Разработка web-приложений на C++

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

Прочитав недавний топик про использование C++ и fastcgi, я наконец-то решился опубликовать свои наработки на тему Web и C++.

Существующие решения, с моей точки зрения, реализуют простые вещи сложным образом. Моей целью было устранить это досадное недоразумение, написав библиотеку, которая позволит писать эффективные кросс-платформенные веб-приложения на С++ так же легко и быстро, как и на PHP, Python, Java, и т.д.
Читать дальше →

Apache, fastcgi и c++: «Hello, world»

Время на прочтение6 мин
Количество просмотров43K
img
Писать web-приложения на C/C++ дело неблагодарное. Многие говорят, что это полное безумие, когда есть PHP и Perl. И я с ними согласен. Это очень просто написать сайт на PHP(особенно используя фреймворки вроде Zend Framework).
Но..(всегда есть какое-то «но»).
Давайте не будем забывать, что простота использования складывается не только из простого синтаксиса. Учитывается множество параметров. И одним из весомых параметров является наличие статей «Get started with ...» с примерами «hello, world»-программ. Я собираюсь добавить немного простоты написанию fastcgi на C/C++. И если прочитав эту статью хоть один человек скажет «А это не так уж и сложно», то я буду считать свою миссию выполненной.
читать далее

Всё ли вы знаете про if?

Время на прочтение4 мин
Количество просмотров106K
Как вы расставляете скобки, что вы включаете в блоки, как вы записываете логические выражения?.. Задумываетесь ли вы о том, что следуя простым правилам, вы можете не только сделать код более читабельным, но и облегчить отладку, улучшить диагностику, повысить производительность?..

Предлагаю 5К мыслей и ссылки на style guide-ы (далее SG). Надеюсь, что эта статья станет приятным и лёгким чтивом. И я уверен, что она затрагивает далеко не все вопросы и надеюсь на содержательное обсуждение.

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

Что скрывает class Empty {}

Время на прочтение3 мин
Количество просмотров9.3K
Это заметка о методах, которые 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

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

Вклад авторов