воскресенье, 8 февраля 2015 г.

Реализация классов в ООП

Реализацыя класса в С++ немного сложннее, чем в Java или C#. Вся сложность состоит в том что классы в С++ состоят из двух файлов: файл заголовка и файл исходника. Файл заголовка хранит в себе общекласовий переменные и структуру самого класса с модификаторами доступа. Файл исходников реализирует весь код класса и заполняет все данные. По сути заглавочний файл это додаток до файла исходникав, чтобы изолировать структуру и обявление переменных(полей), а все ради удобности записи кода. Название етих двух файлов дожни совпадат, а различаются лиш их разширениея. В заголовчном файле ето .h а в файле исходников(реализации) .срр.

 Свойства и методы.

Свойствами, в объектно-ориентированной парадигме программирования, называют блоки, которые хранят в себе какие либо значение, по сути, это обычные переменные.
Методы это фрагменты кода, которые исполняют некие действия в классе, например расчеты и заполнения свойств класса.
Для примера в классе «человек», свойствами будут его имя, фамилия, дата рождения, высота, масса и тому подобное. А вот методами будет ходьба, бег, умственная деятельность и тому подобное. Вот как это будет выгладить в коде С++

class people
{
public:
    double height;
    QDate date_birsdae;
    QString first_name;
    QString second_name;
    int mass;
    
    void Run();
    void Walking();
    void Thinking();
};

 Создание класса в Qt Creator

Как создават новый проект, я думая вам уже не надо, но добавить до существующего проекта новий клас можно двемя способами.
Первый виглядит так:

1)      В вкладке файл выбрат пункт «Новий файл или проект» либо просто нажав на комбинацыю клавиш Ctrl + N.
2)      В открившемся окне вибрать с раздела «Файли и классы» пункт «С++» и соответствено в изменившейся правой части выбрать пункт «Класс С++».
3)      Нажат на кнопку «Выбрать . . . »


4)      В поле «Имя класса» ввести свое название класса, а также возможно выбрать базовый класса и тип класса. Название заголовочного и файла исходников, а также путь, где будут размещены файлы, сгенерируются сами. После этого следует нажать на кнопку «Далее»


5)      Если у вас сейчас открыты несколько проектов, тогда можете выбрать именно тот проект, в который хотите добавить данный класс. После этого можете нажимать на кнопку «Завершить». После этого класс автоматически добавится в ваш проект.


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

Структура классов в С++


И так вот структура файла class1.h.

#ifndef CLASS1_H
#define CLASS1_H
class class1
{
public:
    class1();
};
#endif // CLASS1_H

Директивы компилятора

#ifndef CLASS1_H
#define CLASS1_H

#endif // CLASS1_H

Обеспечивает то, что при вызове #include "class1.h" несколько раз в одном проекте выполнится только один раз, а все остальные разы данную директиву компилятор будет игнорировать.

class class1

ключевое слово class обозначает объявление название самого класса, а class1 то самое название класса. В фигурных скобках записываются данные самого класса, такие как свойства и методы.
 
public:
 
этот рядок обозначает модификатор доступа до свойств и методов, а именно то, что все данные, что там записаны, есть доступными для всех процессов, что находятся вне класса.

class1();

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

Второй файл это файл исходников class1.cpp:

#include "class1.h"
class1::class1()
{
}

Подключается заголовочный файл к файлу исходного кода с помощью всего одной директивы компилятора. #include "class1.h"

class1::class1()
{
}

Даная контракция позволяет получить доступ к конструктору class1() через класс class1. В Фигурных скобках записывается код самого конструктора класса.

воскресенье, 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 очень упрощает программирование, другие говорят, что это опасное дело и перечит линейному программированию, но лично я избегаю такой конструкции и стараюсь заменить ее обычным циклом.