Какие основные типы данных в C++ ты знаешь?

«Какие основные типы данных в C++ ты знаешь?» — вопрос из категории Other, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ система типов фундаментальна и включает как встроенные (fundamental) типы, так и составные (compound), определяемые пользователем.

I. Встроенные (фундаментальные) типы:

  1. Целочисленные (integral):

    • Со знаком: signed char, short, int, long, long long.
    • Без знака: unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long.
    • char (может быть signed или unsigned, зависит от платформы и компилятора).
    • bool (true/false).
    • char8_t (C++20, для UTF-8), char16_t, char32_t, wchar_t.
  2. Типы с плавающей точкой (floating-point):

    • float (обычно 32-bit IEEE-754).
    • double (обычно 64-bit).
    • long double (расширенная точность).
  3. Тип void:

    • Обозначает отсутствие типа. Используется как возвращаемый тип функций, которые ничего не возвращают, и в указателях на неопределенный тип (void*).
  4. Тип std::nullptr_t (C++11):

    • Тип ключевого слова nullptr.

II. Составные (compound) типы:

  • Указатели: T*, T& (ссылки — безопасные «указатели», которые не могут быть null и требуют инициализации).
  • Массивы: T[N].
  • Структуры/Классы: struct, class, union.
  • Перечисления (enumerations): enum, enum class (scoped enum, C++11).

III. Умные указатели (библиотечные, но критически важные):

  • std::unique_ptr<T> — эксклюзивное владение, перемещаемый.
  • std::shared_ptr<T> — разделяемое владение с подсчетом ссылок.
  • std::weak_ptr<T> — слабая ссылка на объект, управляемый shared_ptr.

Ключевые концепции:

  • CV-квалификаторы: const (неизменяемый) и volatile.
  • Модификаторы размера/знака: signed, unsigned, short, long.
  • Точные размеры типов не фиксированы стандартом, а задаются соотношениями (например, sizeof(int) <= sizeof(long)) и определяются ABI платформы. Для точного контроля можно использовать типы фиксированного размера из <cstdint>: int32_t, uint64_t и т.д.

Видео-ответы