воскресенье, 7 июля 2013 г.

Объектно-ориентированное программирование

Объектно-ориентированное, или объектное, программирование (в дальнейшем ООП) – одна из парадигм программирования, которая опирается на модель классов и их представлениях в виде объектов. По сути, объекты это реализация классов в программе, класс как будто бы тип объекта.

Если вы посмотрите вокруг себя, тогда вы можете увидеть, что все что вокруг вас можно представить в виде объектов.

Вот для примера, у нас есть класс “people” со своими полями для хранения информации об имени человека, дате рождения, месте рождения и прочее, но создав объект по образцу “people”, ми создаем объекты со своими уникальными именами и датой рождения. Таким образом, ми можем создать несколько объектов от прототипа “people”. Все эти объекты имеют нечто общее, а именно количество и названия полей, с уникальными данными, что хранятся в этих полях.

В основе объектно-ориентированного программирования лежит четыре понятия: абстракция, инкапсуляция, наследование и полиморфизм.

Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик. Абстракция – это представления программы в виде объектов реального мира.

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

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

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Проще говоря, в разных классах, одинаковые методы могут выполнять различные действия. В двоих классах «Собака» и «Кот», есть одинаковые методы «голос», но в зависимости от класса этот метод исполняет разные действия (голос в собак и котов различается).

В дальнейшим ми рассмотрим реализацию ООП в языке программирования С++.

среда, 8 мая 2013 г.

Основные конструкции языка С++. Часть 2



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

Оператор условного перехода if else.


Конструкция оператора очень проста. Задается, какое не будь условие и в зависимости от результата выполняется одна из ветвей кода. Как известно операции возвращают булевое значение (true / false) и в зависимости от этого значения исполняется код одной из ветвей. Например:

if(N > 1)
{
    // если N больше 1, тогда выполняется код в этой ветке программы.
}
else
{
    // ну а если N все же меньше 1, тогда выполняется код в этой ветке программы.
}

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

if(N > 1)
{
    // если N больше 1, тогда выполняется код в этой ветке программы.
}

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

if()
{
       
}
else if()
{
       
}
else
{
       
}

Оператор switch.


Оператор switch служит для выполнения одной ветви программы, если посланное оператору значение совпадает с одним из заданных значений, например:

int i=2;
   
switch(i)
{
case 1:
    // код программы не исполняется;
break;
       
case 2:
    // значение i совпадает со значением возле оператора case;
break;
       
case 3:
    // код программы не исполняется;
break;
       
case 4:
    // код программы не исполняется;
break;
       
default:
           // код программы исполняется, если значение i не попало в диапазон представленных значений;
break;
}
В теле самой конструкции switch описано операторы case с возможными значениями переменной i. После ветви с кодом программы должен стоять оператор break, который прерывает выполнения конструкции или цикла иначе выполнение не прекратится, а продолжится по списку. В самом конце должен стоять оператор default, который собирает те случаи, в которых значение переменной i не попадает в предположение диапазоны.

Прямой и обратный циклы while


Прямой цикл while записывается так:

while()
{
    // тело цикла
}

Если условие в скобках возвращает результат true, тогда цикл вертится, а как только результат превращается в false, выполнения цикла прекращается. Если необходимо прекратить выполнение цикла для этого существуют такие функции, как break и continue. Оператор break прекращает роботу цикла, а continue  пропускает эту итерацию цикла и переходит к следующей итерации.
   
do
{
    // тело цикла
}
while();

Обратный цикл while ничем не отличается от прямого цикла кроме проверки на условие. Во втором случае если условие отрицательное все равно выполняется одна итерация, тогда как прямой цикл не допускает этого. В некоторых случаях такая манипуляция очень полезна.
   

Цикл for.


Особенностью цикла for состоит в том что в нем задано начальное значение, условие продолжения цикла, а также шаг итерации. В цикле for можно задать 3 условия.
Во-первых, это начальное значение переменной:

int i=0;

Во-вторых, это условие, за выполнение которого, цикл продолжается:

i<10;

В-третьих, это шаг итерации:

i++;

Если переменная не целая, а реальная тогда шаг тоже может бить реальным.

for (int i=0; i<10; i++)
{
    // тело цикла
}
   

Цикл foreach


Цикл foreach создан для обхода массива или списка. В цикле создаётся переменная, в которою потом на каждой итерации записываются значение из массива, а второе значение это сам массив или список.

QStringList names;
names << "Patricia" << "Markus" << "Uli";
foreach(QString name, names)
{
    qDebug() << name;
}

Безусловные переходи goto.


Оператор goto используется для перехода в точку, где инициализирована метка. В случае если исполнение программы подходит к точке перехода (goto label1;), тогда программа переносится в точку, где написана метка (label1:) и продолжает исполнение программы.

    label1:
   
    goto label1;

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

четверг, 25 апреля 2013 г.

Основные конструкции языка С++. Часть 1


Сегодня я расскажу вам о основных конструкциях языка С++. Могу вас заверить конструкции С++ мало чем отличаются от конструкций самого непосредственно Qt.

Директивы

Рассмотрим директиву include, которую ми ставим из самого верху файла, для того чтобы загрузить переменные и функции которые хранятся в заголовочных файлах.

#include <string.h>

Ну, здесь все простою, ключевое слово include со знаком # впереди слова и названием самого файла в кавычках “” или таких скобках <>. Здесь есть разница между записями “” и <>, хоть и небольшая. Сочетание “” используют, если вам нужно загрузить ваш собственный заголовочный файл, то есть тот который вы сами написали. А <> используют для подключения библиотек и модулей Qt, но на практике нет разницы, какие знаки использовать. Заголовочные файлы имеют окончание *.h, в то время когда сами модули библиотек не имеют никакого видимого окончания, но имеют вначале префикс Qt, а непосредственно сами библиотеки или образцы для создания объектов начинаются из буквы Q. Доступ к вложенным образцам объектов происходит через /. Вот пример:

#include <QtCore/QAbstractAnimation>

Теперь рассмотрим такую конструкцию как функции или как их называют в ООП парадигме, методы, но сейчас не об этом. Функция это часть программы, которую часто используют и для этого, чтобы не писать похожий код несколько раз в программе эго выносят в отдельную подпрограмму. Эту подпрограмму можно вызвать в любом месте передав в функции некоторые значения, и в результате одержать результат.

Функции

Функция должна иметь имя, например, function1 и тип значения которое возвращает функция в нашем случае это double. В скобках через запятую записываются типы и название переменных, которые передают функции. В фигурных скобках записывается код программы, а также в теле функции должен бить оператор return i, который возвращает некоторое значение обратно из функции. В случае если перед названием функции стоит ключевое слово void, тогда функция не возвращает никакого значения, а просто исполняет код.

double function1(int i)
{
    i++;
    return i;
}

Самой главной функцией в программу на языке С++ это функция main.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
        
    return a.exec();
}

Именно в этой функции происходят все действия. Дело в том, что при запуске программы, выполнение программы начинается с вызова этой функции. Параметрами функции main является, такие переменные:

argc - количество переданных аргументов командной строки.
argv - массив переданных аргументов командной строки.

Объект QApplication служит для управления всеми ресурсами приложения. Для создания объекта нужно передать параметры argc, argv, так как Qt может сам обрабатывать некоторые аргументы командной строкой.

return a.exec();

Служит для корректного завершения программы и в этом случае возвращает 0.

Структуры

Структура это как бы контейнер нескольких переменных, которые объединяются общем именем people. Структура под именем people хранит в себе информацию о возрасте, высоте, ширине и имени человека.

struct people
{
    int age;
    double width;
    double height;
    char name[10];
};

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

people p1;
p1.name = 'Sasha';
p1.age = 30;
p1.height = 180.2;
p1.width = 60.5;

Здесь ми создали экземпляр человечества p1 и наделили его некими уникальными параметрами как имя, возраст, высоту и ширину. Таким же образом можно получить данные из структуры, а именно:

int r = p1.age;

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