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

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

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

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

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

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

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

Нажмите “Перейти”.

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

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

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

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

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

3. Пример на С

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Простое введение в C++. Часть 2. Конструкторы и деструкторы

Комментарии 9

  • Уважаемый Константин!
    Вы написали: “Класс – это объединение кода и данных”.
    А В ваших “классах” нет данных, там лишь публичные переменные, которые лишают Ваш код одной из главных фишек ООП – объект = чёрный ящик, нельзя ковыряться во внутренностях объекта.
    https://jug.ru/2016/09/bugayenko-west/

    • >А В ваших “классах” нет данных
      Переменные – это тоже данные. Добавьте массив – суть примера не изменится.
      >там лишь публичные переменные
      Добавьте приватную переменнную – суть примера не изменится.
      >из главных фишек ООП объект = чёрный ящик, нельзя ковыряться во внутренностях объекта.
      Это не фишка ООП, а обычная практика языка Си (да и других языков). Если программист – это автор объекта, то он может “ковыряться во внутренностях” сколько угодно. Если программист не автор объекта, а объект скрыт в модуле, то доступа к нему нет.

  • Все сиплюcплюcшники рекомендуют переменные делать недоступными, и по умолчанию так и есть, по умолчанию доступны методы, а вот в си уже изначально присутствует структура данных struct, не помню, может ли входить метод в структуру языка си, но в структуре си++ как раз наоборот, данные доступны по умолчанию и требуют объявления public а вот методы-функции не доступны по умолчанию, но у класса присутствует конструктор и деструктор, вот что важно, это метод, который есть и по умолчанию и он создаёт объект и может быть определён программистом, а вот у структур такого нету… Казалось бы структура и класс почти одно и тоже, но не совсем. Я бы вот хотел дополнить, что класс это всё таки не шаблон, строго говоря, а новый тип данных, или тип объекта, в котором присутствует “жизнь” не только как набор переменных и констант этаких “существительных”, но и “глаголов” , то есть действий с данными. Деструктор тоже можно определить по-своему. А шаблонами в языках программирования называют записи для компиляторов с использованием инструкций для компилятора (макрокоманды), на стадии получения исполняемого или объектного кода, и ещё шаблоном можно бы назвать определение виртуальных функций…. Вообще-то есть у Си++ библиотека шаблонов, шаблонное программирование, там много новеньких понятий для программиста на фортране-79. В общем программирование с классами, это объектно-ориентированное программирование, в котором можно определить свои куски кодов, которые создаются и уничтожаются в программе по мере использования и даже если программист не знает текста а знает что делает объект некоего класса, на основе одного класса он может определить объект своего класса с помощью наследования и работать с ним, они наслаиваются и наслаиваются эти классы.

    • >класс это всё таки не шаблон
      В данной статье слово “шаблон” используется в общепринятом смысле, а не в смысле языка C++.
      >программирование с классами, это объектно-ориентированное программирование
      Нет. Объектно-ориентированное программирование – это стиль программирования, который можно использовать, а можно и не использовать при программировании с классами.

  • Автор застрял в светлом прошлом и явно не хочет смотреть в будущее,а примеры с наследованием особенно неудачные. Аналогия с генетикой и живыми объектами природы,когда каждый из них получал новые свойства и меры,которыми эти объекты используют,чтобы воплощать свои способности.
    И ещё,эти два языка нельзя рассматривать по отдельности( C и C++) -они применяются вместе в одном проекте по мере необходимости.Так как по традиции все операционные системы написаны на чистом Си,то конечно он будет лидировать.
    Но почему то до по явления C# в прикладом программировании был популярен Pascal Delphi.

    • >примеры с наследованием особенно неудачные.
      Суть примеров – показать, как устроен язык C++.
      Если не нравится, то приведите удачный пример наследования, только не абстрактные рассуждения, а конкретный код. Аналогии – это хорошо, но программисту платят не за аналогии, а за написание программ.
      >они применяются вместе в одном проекте по мере необходимости.
      При программировании в стиле ООП их совмещать нельзя. А так, конечно, при желании можно написать программу, хоть на десяти языках сразу.

  • Спасибо большое. Очень методично.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.