C++
- Русское название:
- Cи++
- Дата создания:
- 1983
- Создан под влиянием:
- Повлиял на:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .cpp .c++ .cc .h .hpp
- Диалекты:
- Реализации и версии (свернуть все | развернуть все):
-
- Acorn C/C++
- Borland C++ Builder
-
Digital Mars C/C++
- Digital Mars C/C++ 8.0
- Digital Mars C/C++ 8.10
- Digital Mars C/C++ 8.12
- Digital Mars C/C++ 8.13
- Digital Mars C/C++ 8.15
- Digital Mars C/C++ 8.17
- Digital Mars C/C++ 8.18
- Digital Mars C/C++ 8.18A
- Digital Mars C/C++ 8.18C
- Digital Mars C/C++ 8.18D
- Digital Mars C/C++ 8.18E
- Digital Mars C/C++ 8.20
- Digital Mars C/C++ 8.22
- Digital Mars C/C++ 8.23
- Digital Mars C/C++ 8.25
- Digital Mars C/C++ 8.26
- Digital Mars C/C++ 8.27
- Digital Mars C/C++ 8.28
- Digital Mars C/C++ 8.29
- Digital Mars C/C++ 8.30
- Digital Mars C/C++ 8.31
- Digital Mars C/C++ 8.32
- Digital Mars C/C++ 8.33
- Digital Mars C/C++ 8.34
- Digital Mars C/C++ 8.35
- Digital Mars C/C++ 8.36
- Digital Mars C/C++ 8.37
- Digital Mars C/C++ 8.38
- Digital Mars C/C++ 8.39
- Digital Mars C/C++ 8.40
- Digital Mars C/C++ 8.41
- Digital Mars C/C++ 8.42
- Digital Mars C/C++ 8.43
- Digital Mars C/C++ 8.44
- Digital Mars C/C++ 8.45
- Digital Mars C/C++ 8.46
- Digital Mars C/C++ 8.47
- Digital Mars C/C++ 8.48
- Digital Mars C/C++ 8.49
- Digital Mars C/C++ 8.50
- Intel C/C++
- MIPSpro C/C++
- Microsoft Visual C++
- Open Watcom C/C++
- Open64 C/C++
- PGI C++ Workstation
- Sun Studio C/C++
- Watcom C/C++
- g++
Си++ (англ. C++) — компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования.
Разработка языка началась в 1979 году. Целью создания C++ было дополнение C возможностями, удобными для масштабной разработки ПО, с сохранением гибкости, скорости и портабельности C. Вместе с тем создатели C++ стремились сохранить совместимость с C: синтаксис первого основан на синтаксисе последнего, и большинство программ на C будут работать и как C++. Изначально новый язык назывался “C с классами”, но затем имя было изменено на C++ — это должно было подчеркнуть как его происходжение от C, так и его превосходство над последним.
Первый выпуск C++ для коммерческого использования состоялся в 1985 году, вместе с публикацией книги “The C++ Programming Language”, которая на долгое время стала его неофициальным стандартом. В 1989 году вышла вторая версия языка в сопровождении книги “The Annotated C++ Reference Manual”.
В 1990-х годах язык стал одним из наиболее широко используемых языков программирования общего назначения. Первым официальным стандартом языка стал ISO/IEC 14882:1998, более известный как C++98. В 2003 году была принята его дополненная версия, C++03, а в 2005 году был опубликован “Library Technical Report 1” (сокращенно TR1) — документ, описывающий расширения стандартной библиотеки. TR1 не является стандартом, но большинство актуальных компиляторов C++ поддерживает его. Наконец, в 2011 году был принят текущий стандарт, C++11.
Нововведениями C++ в сравнении с C являются:
- поддержка объектно-ориентированного программирования через классы. C++ предоставляет все четыре возможности ООП — абстракцию, инкапсуляцию, наследование (в том числе и множественное) и полиморфизм.
- поддержка обобщённого программирования через шаблоны функций и классов;
- стандартная библиотека C++ состоит из стандартной библиотеки C (с некоторыми модификациями) и библиотеки шаблонов (Standard Template Library, STL), которая предоставляет обширный набор обобщенных контейнеров и алгоритмов;
- дополнительные типы данных;
- обработка исключений;
- виртуальные функции;
- пространства имён;
- встраиваемые (inline) функции;
- перегрузка (overloading) операторов;
- перегрузка имён функций;
- ссылки и операторы управления свободно распределяемой памятью.
Элементы синтаксиса:
Комментарий до конца строки | // |
---|---|
Комментарии, которые не могут быть вложенными | /* ... */ |
Регистрозависимость | да |
Регулярное выражение идентификатора переменной | [_a-zA-Z][_a-zA-Z0-9]* |
Регулярное выражение идентификатора функции | [_a-zA-Z][_a-zA-Z0-9]* |
Присваивание значения переменной | varname = value |
Объявление переменной | type varname |
Объявление переменной с присваиванием значения | type varname = value |
Группировка выражений | ( ... ) |
Блок | { ... } |
Равенство | a == b |
Неравенство | a != b |
Тождественное равенство | *a == *b (a и b - указатели) |
Тождественное неравенство | *a != *b (a и b - указатели) |
Сравнение | < > <= >= |
Определение функции | returntype functionName (argtype1 argname1, ..., argtypeN argnameN) |
Вызов функции | functionName(arg1, ..., argN) |
Вызов функции без параметров | functionName() |
Последовательность | ; |
Если - то | if (condition) trueBlock |
Если - то - иначе | if (condition) trueBlock else falseBlock |
Бесконечный цикл | while (true) loopBody |
Цикл с предусловием | while (condition) loopBody |
Цикл с постусловием | do loopBody while (!condition) |
Цикл for - next для диапазона целых чисел с инкрементом на 1 | for (int i = first; i <= last ; i++) |
Цикл for - next для диапазона целых чисел с декрементом на 1 | for (int i = last; i >= first; i--) |
Примеры:
Факториал:
Пример для версий Borland C++ Builder 6, g++ 4.xИспользуется рекурсивное определение факториала.
#include <iostream>
unsigned long long factorial(unsigned long long n)
{
if (n == 0)
return 1;
else
return n * factorial (n - 1);
}
int main(void)
{
for (int n = 0; n <= 16; n++)
std::cout << n << "! = " << factorial(n) << std::endl;
return 0;
}
Hello, World!:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5, g++ 4.x#include <iostream>
int main(void)
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
Числа Фибоначчи:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5#include <iostream>
int fibonacci(int n)
{
return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2));
}
int main(void)
{
for (int n=1; n<=16; n++)
std::cout << fibonacci(n) << ", ";
std::cout << "..." << std::endl;
return 0;
}
Факториал:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5Используется рекурсивное определение факториала. Реализация отличается от альтернативной использованием типа __int64
вместо unsigned long long
и функции вывода на печать printf
вместо std::cout <<
.
#include "stdio.h"
__int64 factorial(__int64 n)
{
return (n==0 ? 1 : n*factorial(n-1));
}
int main(int argc, char* argv[])
{
for (int n=0; n<=16; n++)
printf("%d! = %I64d\n",n,factorial(n));
return 0;
}
Квадратное уравнение:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5В этом примере используется класс complex<>
, входящий в состав библиотеки STL. Все вычисления выполняются в комплексных числах, т.к. это позволяет не беспокоиться о знаке дискриминанта и различных представлениях корней для действительного и комплексного случаев.
Оператор >>
класса complex<>
перегружен так, что он распознает несколько форматов вводимых чисел, в т.ч. и числа без мнимой части, так что константы A, B и C читаются не как целые числа, а сразу как комплексные. Такая реализация позволяет расширить область применения примера до уравнений с дробными и даже комплексными коэффициентами.
Оператор <<
класса complex<>
также перегружен и выводит любое комплексное число x
как (x.real(),x.imag())
, поэтому для вывода корней без мнимой части как обычных дробных чисел используется функция print
.
#include <iostream>
#include <complex>
#include <math>
using namespace std;
void print(int ind, complex<double> x)
{ cout << "x" << ind << " = ";
if (fabs(x.imag()) < 1E-6)
cout << x.real() << endl;
else cout << x << endl;
}
void main()
{ complex<double> A, B, C, D, x1, x2;
cout << "A = ";
cin >> A;
if (abs(A)<1E-3)
{ cout << "Not a quadratic equation." << endl;
return;
}
cout << "B = ";
cin >> B;
cout << "C = ";
cin >> C;
A *= 2;
D = B*B-A*C*2.0;
if (abs(D)<1E-3)
cout << "x = " << (-B/A).real();
else
{ print(1, (-B+sqrt(D))/A);
print(2, (-B-sqrt(D))/A);
}
}
Hello, World!:
Пример для версий Borland C++ Builder 6, TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
Квадратное уравнение:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)Этот пример работает на C и C++, а также на Objective-C, являющемся строгим надмножеством языка C. В случае C может понадобиться компилировать программу с опцией -lm
, чтобы подключить библиотеку математики.
#include <math.h>
#include <stdio.h>
int main()
{
int A, B, C, D;
printf("A = ");
scanf("%d", &A);
if (A == 0) {
printf("Not a quadratic equation.\n");
return 0;
}
printf("B = ");
scanf("%d", &B);
printf("C = ");
scanf("%d", &C);
D = B * B - 4 * A * C;
if (D == 0) {
printf("x = %f\n", -B / 2.0 / A);
return 0;
}
if (D > 0) {
printf("x1 = %f\nx2 = %f\n",
(-B + sqrt(D)) / 2.0 / A, (-B - sqrt(D))/ 2.0 / A);
} else {
printf("x1 = (%f, %f)\nx2 = (%f, %f)\n",
-B / 2.0 / A, sqrt(-D) / 2.0 / A, -B / 2.0 / A, -sqrt(-D) / 2.0 /A);
}
return 0;
}
CamelCase:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), g++ 4.xЭта программа обрабатывает введенную строку посимвольно. Функция getline
считывает из потока ввода, заданного первым аргументом, строку (не до пробела, а до конца строки) и записывает ее во второй аргумент. Стандартная функция tolower
работает только с одиночными символами, поэтому для преобразования в нижний регистр строки целиком используется функция transform
, которая применяет заданную функцию ко всем элементам вектора (а в STL строка — это вектор символов). Затем для каждого символа строки проверяется, является ли он символом алфавита (функция isalpha
), и в зависимости от результата он либо дописывается в конец результирующей строки (в верхнем регистре, если перед ним был не-алфавитный символ), либо устанавливает признак “последний символ был пробелом”. Функция isalpha
работает с символами любого регистра, поэтому перевод в нижний регистр можно было делать не отдельным действием над всей строкой, а при присоединении каждого отдельного символа.
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string text, cc="";
bool lastSpace = true;
getline(cin, text);
transform(text.begin(), text.end(), text.begin(), (int (*)(int))tolower);
for (int i=0; i<text.size(); i++)
if (isalpha(text[i])) {
if (lastSpace)
cc += toupper(text[i]);
else
cc += text[i];
lastSpace = false;
}
else {
lastSpace = true;
}
cout << cc << endl;
return 0;
}
Числа Фибоначчи:
Пример для версий g++ 4.xИспользуется итеративное вычисление чисел Фибоначчи; вычисленные значения сохраняются в массиве.
#include <iostream>
#include <vector>
using std::cout;
using std::vector;
int main() {
vector<int> fib(17);
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i < 17; ++i) {
fib[i] = fib[i - 2] + fib[i - 1];
}
for (int i = 1; i < 17; ++i) {
cout << fib[i] << ", ";
}
cout << "...\n";
}
Комментарии
]]>blog comments powered by Disqus
]]>