Типы данных
Типы данных
Как и в си, переменные в С++ должны иметь валидное имя. То есть, состоять из чисел, букв и знака подчёркивания, не должны начинаться с цифры и не должны совпадать со служебными словами, которых теперь стало больше
| 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 познакомимся поздее более подробно.
