Типы данных
Типы данных
Как и в си, переменные в С++ должны иметь валидное имя. То есть, состоять из чисел, букв и знака подчёркивания, не должны начинаться с цифры и не должны совпадать со служебными словами, которых теперь стало больше
alignas | alignof | and | and_eq |
asm | auto | bitand | bitor |
bool | break | case | catch |
char | char16_t | char32_t | class |
compl | const | constexpr | const_cast |
continue | decltype | default | delete |
do | double | dynamic_cast | else |
enum | explicit | export | extern |
false | float | for | friend |
goto | if | inline | int |
long | mutable | namespace | new |
noexcept | not | not_eq | nullptr |
operator | or | or_eq | private |
protected | public | register | reinterpret_cast |
return | short | signed | sizeof |
static | static_assert | static_cast | struct |
switch | template | this | thread_local |
throw | true | try | typedef |
typeid | typename | union | unsigned |
using | virtual | void | volatile |
wchar_t | while | xor | xor_eq |
Как и си, С++ регистрозависимый язык.
Основные типы данных
Базовые типы данных в C++ можно разбить на несколько групп
Знаковый тип. Переменные знакового типа могут использоваться для хранения одного символа. Самый простой тип char, размер которого равен 1 байт. Также имеются типы для представления знаков, размером больше одного байта
Название | Назначение |
---|---|
char | Всегда 1 байт. Минимум 8 бит |
char16_t | 2-х байтный символ |
char32_t | 4-х байтный символ |
wchar_t | Используется для представления самого широкого из поддерживаемых наборов символов |
Вообще-то эти типы есть и в си, мы не останавливались подробно на изучении представления строк.
Целочисленные типы данных. Как и в си, могут обладать модификаторами signed и unsigned. Как и в си, основными типами являются char, int, long и long long. Ничего нового здесь не появилось.
Числа с плавающей точкой. Представлены типами float, double и long double. Ничего нового по сравнению с си.
Все описанные выше типы называют также арифметическими. Кроме них существует ещё пустой тип – void (также ничего нового по сравнению с си) и нулевой указатель. Теперь, вместо NULL с его удивительными свойствами, появился новый фундаментальный тип nullptr_t с единственным значением nullptr, который хранит нулевой указатель и равен только сам себе. При этом, он может быть приведён к нулевому указателю нужного типа.
В си++ введён булев тип. Он хранит всего два возможных значения true и false.
Си++ поддерживает также множество составных типов данных, которые будут рассмотрены позднее.
Объявление и инициализация переменных
В С++ переменные могут быть объявлены в любом месте внутри функции, а не только в самом начале блока кода В том числе, переменные могут быть объявлены и внутри цикла for.
float a; float b; float sum; float step; a = 3.0f; b = 4.3f; sum = 0.0f; step = 0.05f; for (float i = a; i < b; i += step) { sum += i * i; } float mid = sum / (b - a) / step;
Инициализировать переменные можно при создании как в си
int x = 0;
либо, используя конструктор
int x(0); double d(3.2);
Кроме того, в С++ 2011 появилась т.н. uniform initialization, универсальная инициализация, которая позволяет использовать один синтаксис для инициализации любых объектов
struct Point { int x; int y; }; struct Point position = { 3, 4 }; Point *pt = new Point{6, 8}; int length{5};
Вывод типов
В си++ 2011 служебное слово auto используется для автоматического определения типа переменных. Часто тип переменной может быть определён, исходя из правой части инициализации. В том случае, когда компилятор может однозначно определить тип, его можно задавать с помощью служебного слова auto:
auto x = 3; //эквивалентно int x = 3; auto point = new Point; //эквивалентно Point *point = new Point
Кроме этого, есть возможность задавать тип переменной по уже имеющемуся типу, с помощью служебного слова decltype
int intX = 42; decltype(intX) intY = 33; //эквивалентно int intY = 33; auto pt1 = new Point; decltype(pt1) p2 = new Point{2, 6}; //эквивалентно //Point *pt1 = new Point; //Point *pt2 = new Point{2, 6}
Строки
В С++ нет базового типа строка. Однако есть стандартная библиотека string, которая предоставляет класс для работы со строками.
#include <iostream> #include <string> void main() { std::string first_name = "Vasya"; std::string last_name = { "Pupkin" }; //конкатенация строк auto full_name = first_name + " " + last_name; std::string *department = new std::string("Department of copying and scanning"); std::cout << full_name << std::endl; //сравнение строк std::string a = "A"; std::string b = "B"; if (first_name.compare(last_name) > 0) { std::cout << a + " > " + b << std::endl; } else { std::cout << a + " < " + b << std::endl; } //подстрока std::string subs = department->substr(0, 10); std::cout << subs << std::endl; //замена подстроки std::cout << last_name.replace(0, 1, "G") << std::endl; //вставка std::string new_department = department->insert(department->length(), " and shreddering"); std::cout << new_department << std::endl; delete department; system("pause"); }
Со стандартной библиотекой string познакомимся поздее более подробно.
