Простое введение в C++. Часть 1. Классы

2 April

В этой статье мы рассмотрим простое и понятное введение в С++. Хотя C++ кажется сложным, но это происходит потому, что при его описании используют много туманных абстракций и лишних терминов.

Мы же рассмотрим C++ без всякой философии, с точки зрения программиста-практика.

1. Сравнение С и С++

Начнем с хорошей новости. Язык C++ — это клон языка C, в который были добавлены средства работы с классами. Поэтому, если вы знаете язык C, то вы уже на 90% знаете C++. Первоначально C++ так и назывался «Си с классами», но потом решили дать более «си-шное» название, то есть добавили единичку к C. Поэтому нам нужно разобраться только с программированием в классах. Что мы сейчас и сделаем.

2. Создание нового проекта

Запустите CodeBlocks, создайте новый проект и выберите шаблон «Console application».

Нажмите «Перейти».

Выберите C++ и нажмите Next.

Укажите папку и имя файла и нажмите Next.

Нажмите Finish. Вы получили минимальную программу на C++.

Нажмите F9 для компиляции и запуска программы.

Все работает.

3. Пример на С

Так как C++ — это клон C, то мы можем писать код, как обычно мы это делаем в языке C. Сделаем это, чтобы потом сравнить отличия. Напишем следующую программу:

# include <iostream>

using namespace std;

int Sum(int x, int y)

{

return x + y;

}

int main()

{

int x = 5;

int y = 10;

int z = Sum(x,y);

cout << "Sum = " << z << endl;

return 0;

}

В этой программе все просто. Есть две переменных x и y, и есть функция Sum, которая складывает два числа. Обозначение «cout <<» можно рассматривать как вариант функции printf.

Скопируйте этот текст и убедитесь, что все работает.

4. Главный секрет C++

А теперь мы напишем ту же самую программу, но уже с классами. И для этого нам нужно знать главный секрет C++.

Главный секрет C++:

Класс — это объединение кода и данных.

Как видите, секрет достаточно прост. Запишем нашу программу но уже с помощью класса:

# include <iostream>

using namespace std;

class Summa

{

public:

int x;

int y;

int Sum()

{

return x + y;

}

};

int main()

{

// Программирование с классами

Summa s;

s.x = 6;

s.y = 12;

z = s.Sum();

cout << "Sum = " << z << endl;

return 0;

}

Итак, что мы сделали?

Мы создали класс Summa с помощью ключевого слова class. Но класс — это просто шаблон. Для использования класса нужно получить экземпляр класса. Это мы сделали в строке «Summa s;». После того, как эта строка выполнится, мы получим экземпляр класса, к которому же можно обращаться. При этом переменные класса называются свойства, а функции класса называются методы.

Обратите внимание, что функция Sum не требует указания параметров, потому она берет эти параметры из свойств класса.

Обращение к свойствам и методам производится с помощью точки. Например, «s.x» — означает, что мы обращаемся к свойству экземпляра s класса Summa.

Ключевое слово public означает, что свойства и методы класса доступны вне класса.

5. Наследование классов

И теперь познакомимся с ключевым понятием программирования в классах — наследованием.

Опять же сравним с чистым Си.

Допустим, что нам нужно не только суммировать числа, но и удвоить результат. В языке Си один вариантов это сделать — использовать вложенную функцию:

int Sum(int x, int y)

{

return x + y;

}

int Sum2(int x, int y)

{

return Sum(x,y) * 2;

}

В этом примере функция Sum2 использует вызов функции Sum. Важный момент здесь в том, что те параметры, которые были переданы на вход функции Sum2 просто передаются на вход функции Sum. Такая сквозная передача параметров — это обычная практика C.

Но мы видели, что в классе мы параметры не использовали. Как же их передать? Для этого в C++ используется наследование.

# include <iostream>

using namespace std;

class Summa

{

public:

int x;

int y;

int Sum()

{

return x + y;

}

};

class Summa2 : public Summa

{

public:

int Sum2()

{

return Sum() * 2;

}

};

int main()

{

// Программирование с классами

Summa s;

s.x = 6;

s.y = 12;

cout << "Sum = " << s.Sum() << endl;

// Наследование класса

Summa2 s2;

s2.x = 7;

s2.y = 13;

cout << "Sum = " << s2.Sum2() << endl;

return 0;

}

В этом примере в строке «class Summa2 : public Summa» мы указываем, что класс Summa2 наследуется от класса Summa. Это позволяет обратиться к свойствам и методам наследуемого класса.

Там где в С используются вложенные функции, там в C++ используются вложенные классы.

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

И несколько слов надо сказать про рекламную чепуху вокруг C++. Обычно в книжках про C++ пишут о том, что программирование в классах позволяет не больше и не меньше как моделировать весь мир. Это весьма странное заявление. Любая программа — это код и данные. Их можно написать отдельно, можно объединить в общую структуру, но от этого принципиально ничего не меняется. Любая программа на С может быть переписана в классах, а любая программа в классах может быть переписана на С.

То есть C++ не дает программисту какого-то ключевого преимущества, именно поэтому язык C++, который позиционировался как замена C, так и не смог его заменить. Для интереса можно посмотреть TIOBE-рейтинг этих языков в сентябре 2018.

Можно ли стать программистом за год с нуля?
Читайте в моей бесплатной мини-книге «Путь в программисты». Скачать её можно здесь.