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
Компилирование
-
Программист пишет код и сохраняет его в виде .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;
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
появились и на больших платформах.