понедельник, 12 декабря 2011 г.

Скомпилировать программу С++ под линукс G++ компилятором


Как компилировать под линукс?
Как скомпилировать программу под линукс?
Как компилировать в линуксе?

Ответ далее.

воскресенье, 11 декабря 2011 г.

Перехват сообщений SIGSEGV (Segmentation Fault) и SIGFPE (Floating point exception)

Разрабатывал на днях класс древовидного списка CTree, как раз создавал конструктор копирования.
Случайно забыл обнулить указатель в конструкторе копирования, что привело в дальнейшем к не всегда выпадающей ошибке доступа к памяти.
Разработка велась в Qt Creator. И ошибка доступа памяти приходила сообщением от ОС в виде сигнала SIGSEGV.

суббота, 10 декабря 2011 г.

Передача переменных по значению в функцию

Возможно, вы задавались следующими вопросами:
Порядок передачи переменной в функцию?
Как передаётся переменная в функцию?
Создаётся ли временная переменная, при вызове функции?

Данный пример демонстрирует ответ на ваши вопросы.

Порядок выполнения конструктора и деструктора при наследовании


Рассмотрим порядок выполнения конструкторов/деструкторов, когда один класс наследуется другим. В таком случае конструкторы выполняются по порядку, начиная с самого базового класса. А когда происходит удаление объекта, то деструкторы выполняются начиная с вершины наследования (т.е. с самого последнего потомка)

Порядок выполнения конструктора и деструктора при наследовании

Порядок выполнения конструктора и деструктора

Рассмотрим порядок выполнения конструктора и деструктора при создании простого объекта.

четверг, 8 декабря 2011 г.

Почему не приходит сигнал об ошибке при delete невалидного указателя?

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

понедельник, 5 декабря 2011 г.

Перегрузка операторов

Складываю сюда примеры перегрузок операторов, в качестве памятки как это работает. Часть примеров реализована для Qt.

Полезные ссылки

1. http://www.parashift.com/c++-faq-lite/templates.html
Секреты шаблонов С++. Ответы на важные аспекты применения шаблонов в С++ с примерами. Для себя узнал много нового и интересного.

2. http://maddog.sitengine.ru/smart-question-ru.html (оригинал на английском здесь)
Как правильно задавать вопросы на IT форумах, как показать, что вы адекватный человек.
В статье есть параграф "Вопросы, которые не стоит задавать", где описано, что думает хакер, читая тот или иной вопрос.

воскресенье, 4 декабря 2011 г.

Шаблоны С++


Появилась желание написать шаблон класса, но когда я описал класс в файле .h, а реализовал методу в - .cpp, моя программа отказалась компилироваться. В поисках истины я решил скинуть всё в один файл main.cpp: и класс и его реализацию. И на моё удивление программа успешно откомпилировалась! С этого момента я начал поиски ответа на этот вопрос...

DeadClass

Пришла идея написать DeadClass. Так как следующий вариант отказался компилироваться
class DeadClass {
public:
    DeadClass a;
    DeadClass() {}
};
int main()
{
    DeadClass a;
    return 0;
}
то пришлось остановиться на таком варианте

Таблица приоритетов операторов в С++

Наивысший приоритет
()  []  ->  ::  .
!   ~   ++  --  -   *   &   sizeof  new  delete  typeid
(операторы приведения типа)
.*  ->*
*   /   %
+   -
<<  >>
<   <=  >   >=
==  !=
&
^
|
&&
||
?:
=   +=  -=  *=  /=  %=  >>=  <<=  &=  ^=  |=
,
Низший приоритет

суббота, 3 декабря 2011 г.

Заметки о Qt

Как перенаправить вывод qDebug() в консоль Qt Creator, когда я работаю с консольным приложением?

Перенаправить вывод в консоль в Qt Creator можно отключив галочку "Run in terminal", располагающуюся в разделе "Projects" на левом вертикальном меню и во вкладке "Desktop Run".

 


пятница, 2 декабря 2011 г.

Заметки о С++

[статья в разработке]

Арифметические операторы
высший,           низший   приоритеты
++  --  -  *  /  %  +  -
------  -  -------  ----
  1     2     3      4
        |
        V
     Унарный 
      минус


Пример простой программы на языке C++
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 5;
    int c = a + b;
    cout << "c = " << c;

    return 0;
}
В результате программа выведет:
с = 6