🏠 | 💻 IT | Программирование Code |

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

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

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

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

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

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

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

Линкер соединяет эти .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; } 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 это ещё одна функция add, но, например, с тремя параметрами.

double add(double a, double b, double c) { return a + b + c; }

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

Перегрузку по типу возвращаемого значения делать нельзя.

#include <iostream> using namespace std; bool test(bool x) { return x; } bool test(double x) { return x > 0; } int main() { // 1 if (test(true)) { cout << "true passes the test" << endl; } // 2 if (test(3.2)) { cout << "3.2 passes the test" << endl; } // 3 if (test(3)) { cout << "3.2 passes the test" << endl; } return 0; }

1 и 2 могут спокойно существовать вместе. Но как только Вы захотите проверить целое число - получите ошибку.

1>C:\Users\urn.su\source\repos\project\example.cpp(55,5): error C2668: 'test': ambiguous call to overloaded function

1>C:\Users\urn.su\source\repos\project\example.cpp(20,6): message : could be 'bool test(double)'

1>C:\Users\urn.su\source\repos\project\example.cpp(15,6): message : or 'bool test(bool)'

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 #include 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, то это ошибка компиллятора.

Если на L, то линкера.

test local function definitions are illegal C++

Появляется если Вы случайно определили функцию не перед main а внутри main.

Error C2660 : function does not take 3 arguments

Компилятор ждёт, что у функции будет другое количество аргументов.

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

Error LNK2019 unresolved external symbol

Линкер видит, что вызывается функция, которая нигде не задана.

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

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

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

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

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

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

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

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

Предыдущий урок Следующий урок

Если остались вопросы - смело задавайте их в комментариях.

Поиск по сайту
Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: