Типы данных

Теги: С++ типы данных, auto, decltype, автоматический вывод типов



Типы данных

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

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 познакомимся поздее более подробно.

Q&A

Всё ещё не понятно? – пиши вопросы на ящик email
Быстрое введение в язык