C++

Содержание
Введение
using namespace
Угадать число
Return Type
Multiple Files
Header Files
Strings
getline()
Где учить C++
Другие статьи о C++

Введение

C++ читается как си-плюс-плюс — компилируемый, статически типизированный язык программирования общего назначения.

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

C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

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

Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C# .

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

Сайт, посвящённый стандартизации языка isocpp.org

Проверить какие функции поддерживает определённый компилятор можно на сайте cppreference.com

Компилирование

  1. Программист пишет код и сохраняет его в виде .cpp файлов.

    Обычно в .cpp файл нужно добавить подключение библиотек или других файлов - это делается с помощью #include


  2. Сперва по этим файлам проходи препроцессор и включает в них всё что нужно включить.

  3. После препроцессора в дело вступает компилятор.

    Компилятор обрабатывает эти .cpp файлы и делает из них .o файлы или .obj файлы.


  4. Линкер соединяет эти .o файлы в .exe файл.

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

Например, gcc может работать странно, если Вы запускаете компилятор командой gcc и нормально, если Вы запускаете g++

По умолчанию после компиляции создается файл a.exe который нужно отдельно запустить. Настроить поведение компилятора можно, например, с помощью makefile

Visual Studio по умолчанию компилирует все .cpp файлы, входящие в состав проекта.

using namespace std;

У начинающего изучать C++ может возникнуть вопрос: зачем перед main() понаписана куча кода.

Например, зачем писать using namespace std;

Можно не писать, но тогда при каждом использовании cout или, например, endl нужно будет непосредственно указывать из какого пространства имён Вы их берёте

Выглядеть это будет примерно так:

#include <iostream> int main() { std::cout << "Заходите на HeiHei.ru!" << std::endl << "Или на TopBicycle.ru" << std::endl << 2.5*4; return 0; }

Оператор :: имеет специальное название - Оператор расширения области видимости или Scope Resolution Operator

<< - Insertion Operator

Если Вы пользуетесь сразу несколькими библиотеками, то, возможно, так даже лучше - нет риска получить конфликт имён.

Но для начинающего изучать C++ это возможно слишком громоздко.

using namespace std; позволяет записать то же самое без постоянных std::

#include <iostream> using namespace std; int main() { cout << "Заходите на HeiHei.ru!" << endl << "Или на TopBicycle.ru" << endl << 2.5*4; return 0; }

Угадать число

Упраженение: написать игру, в которой пользователю нужно угадать заранее заданное число.

Нужно давать подсказки является ли введённое число большим или меньшим чем загаданное.

Решение:

#include <iostream> using namespace std; int main() { int i; bool keepgoing = true; int answer = 7; while (keepgoing) { cout << "Угадайте число "; cin >> i; if (i < answer) { cout << "Ваше число, " << i << ", меньше загаданного. " << endl; cout << "Попробуйте ещё" << endl; } if (i == answer) { cout << "Вы угадали, поздравляю, игра окончена" << endl; keepgoing = false; } if (answer < i) { cout << "Ваше число, " << i << ", больше загаданного. Попробуйте ещё" << endl; } if (i != answer) { cout << "Попробовать ещё? 0 for no "; cin >> again; if (again == 0) { keepgoing = false; } } } }

Пример функции, которая складывает два числа и не возвращает предупреждений об ошибках в типах int - double

#include <iostream> using namespace std; double add(double x, double y) { return x + y; } int main() { auto a = add(3, 4); cout << "3 + 4 is " << a; // 7 cout << endl; double b = add(1.3, 4.5); cout << "1.3 + 4.5 это " << b; // 5.8 return 0; }

Перегрузка функций

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

Пример перегрузки функции add() можете изучить в статье

«Перегрузка функций C++»

Return Type

Как Вы уже заметили, в большинство функций заканчиваются на return 0;

Если вы пишете функцию, которая ничего возвращать не должна, нужно указать перед названием функции void

#include <iostream> using namespace std; void test() { return; }

Multiple Files

Файл можно разделить на несколько частей. В том, где Вы вызываете main() укажите названия функций, которые Вы перенесли в другой файл и аргументы, которые они принимают.

Главный файл:

#include <iostream> using namespace std; double add(double x, double y); double add(double a, double b, double c); bool test(bool x); bool test(double x); void test(int y); int main() {

и так далее

Файл с функциями:

bool test(bool x) { return x; } bool test(double x) { return x > 0; } double add(double x, double y) { return x + y; } double add(double a, double b, double c) { return a + b + c; }

Header Files

Чтобы не перечислять все функции которые Вы хотите использовать в главном файле можно упомянуть их в специальном Header файле с расширением .h

Затем этот файл нужно будет подключить к главному с помощью директивы #include

Главный файл:

#include <iostream> #include "Functions.h"

Файл Functions.h

double add(double x, double y); double add(double a, double b, double c); bool test(bool x); bool test(double x); void test(int y);

Файл Functions.cpp остаётся без изменений.

Strings

#include <iostream> #include <string> using namespace std; int main() { string name; cout << "who are you?" << endl; cin >> name; string greeting = "Hello, " + name; if (name == "Andrei") { greeting += ", I know you!"; } cout << greeting << endl; int l = greeting.length(); cout << "\"" + greeting + "\" is " << l << " characters long. " << endl; auto space = greeting.find(' ' string beginning = greeting.substr(space + 1); cout << beginning << endl; if (beginning == name) { cout << "expected result. " << endl; } return 0; }

Задача - сравнить два введённых слова и определить какое длиннее.

using namespace std; int main() { string word1; string word2; cout << "Enter first word" << endl; cin >> word1; cout << "Enter 2nd word" << endl; cin >> word2; if (word1.length() == word2.length()) { cout << "words have the same length"; } if (word1.length() > word2.length()) { cout << "word1 is longer"; } if (word1.length() < word2.length()) { cout << "word2 is longer"; } return 0; }

Этот код будет работать только если слово введено без пробелов.

Чтобы сравнивать длины строк воспользуемся getline()

#include <iostream> #include <string> using namespace std; int main() { string line1; string line2; cout << "Enter first word" << endl; getline(cin , line1); cout << "Enter 2nd word" << endl; getline(cin , line2); if (line1.length() == line2.length()) { cout << "words have the same length"; } if (line1.length() > line2.length()) { cout << "line1 is longer"; } if (line1.length() < line2.length()) { cout << "line2 is longer"; } return 0; }

Где учиться C++

Если бесплатно, то советую сайт ravesli.com .

Они перевели официальный учебный сайт C++ на русский язык и, как мне кажется, качество не пострадало.

Можно найти хорошие видео на русскоязычном youtube

Если у Вас есть возможность купить платный курс, начните с чего-нибудь не слишком дорогого.

Для тех, кто знает английский может подойти:

Eduonix . Они предлагают курс для новичков и несколько подобных.

На Pluralsight есть длинный курс по C++ но я не очень понял на кого он рассчитан. Для новичков там слишком много пропущено. Для опытных там слишком много вводной информации. Подойдёт только как дополнение к какому-то другому курсу.

На русском языке у OTUS есть курс для новичков и для продвинутых

Российские образовательные гиганты вроде Geekbrains Нетологии и Skillbox насколько я знаю не предлагают кусов по C++ возможно это связано с высоким входным порогом, низким хайпом и спецификой вакансий.

UPD: теперь курсы по С++ и даже C появились и на больших платформах.