---
title: Основные понятия
seo:
  title: Основные понятия — C++ Developer
  description: Тема «Основные понятия» для собеседования C++ Developer. Что такое класс? Какие основные типы данных в C++?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что такое класс?</strong> [#q-14bee738d69b81cab7b2dcd54bb6ecaa]

Класс в C++ — это пользовательский тип данных, который объединяет данные (поля) и функции (методы), работающие с этими данными, в одну логическую единицу. Класс используется для создания объектов и инкапсуляции данных и поведения.

Основные характеристики класса&#58;

1. <strong>Поля</strong>&#58; Переменные, хранящие данные объекта.

1. <strong>Методы</strong>&#58; Функции, определяющие поведение объекта.

1. <strong>Инкапсуляция</strong>&#58; Скрытие данных и предоставление
   интерфейсов для работы с ними.

1. <strong>Наследование</strong>&#58; Возможность создания нового класса на
   основе существующего.

1. <strong>Полиморфизм</strong>&#58; Возможность использовать объекты
   производных классов через указатели или ссылки на базовые классы.

Пример&#58;

```cpp
class Point {
public:
    int x, y;
    void set(int a, int b) {
        x = a;
        y = b;
    }
};
```

Объекты класса создаются и используются следующим образом&#58;

```cpp
Point p;
p.set(10, 20);
```

:::note[Ссылки для изучения]

1. [Классы. Основы C++](https://education.yandex.ru/handbook/cpp/article/classes)
   :::

---

## <strong>Какие основные типы данных в C++?</strong> [#q-14bee738d69b81ad90c4d098b99454e7]

В C++ основные типы данных делятся на несколько категорий&#58;

#### Примитивные типы данных&#58;

{/* prettier-ignore */}
1. <strong>Целочисленные типы</strong>&#58;

    - <code>int</code> (обычный целый число)

    - <code>short</code> (короткое целое число)

    - <code>long</code> (длинное целое число)

    - <code>long long</code> (очень длинное целое число)

    - <code>unsigned</code> версии этих типов (беззнаковые целые числа)

1. <strong>Символьные типы</strong>&#58;

    - <code>char</code> (символ)

    - <code>unsigned char</code> (беззнаковый символ)

    - <code>signed char</code> (знаковый символ)

    - <code>wchar&#95;t</code> (широкий символ, используется для представления символов Unicode)

    - <code>char16&#95;t</code> (символы Unicode, 16-битные)

    - <code>char32&#95;t</code> (символы Unicode, 32-битные)

1. <strong>Типы с плавающей точкой</strong>&#58;

    - <code>float</code> (одинарной точности)

    - <code>double</code> (двойной точности)

    - <code>long double</code> (расширенной точности)

1. <strong>Булевый тип</strong>&#58;

    - <code>bool</code> (истина/ложь)

1. <strong>Тип пустого значения</strong>&#58;

    - <code>void</code> (используется для указания отсутствия значения, например, в функциях)

#### Сложные типы данных&#58;

1. <strong>Массивы</strong>&#58; Наборы элементов одного типа.

   ```cpp
   int arr[10];
   ```

1. <strong>Структуры (</strong>
   <code>struct</code>
   <strong>)</strong>&#58; Пользовательские типы данных, объединяющие различные
   типы данных.

   ```cpp
   struct Point {
       int x;
       int y;
   };
   ```

1. <strong>Объединения (</strong>
   <code>union</code>
   <strong>)</strong>&#58; Пользовательские типы данных, где все члены разделяют
   одну область памяти.

   ```cpp
   union Data {
       int i;
       float f;
       char c;
   };
   ```

1. Классы, объявленные через class или struct, поддерживают методы, наследование и полиморфизм. Различаются доступ к членам и вид наследования по умолчанию&#58; private для class, public для struct.

   ```cpp
   class Point {
   public:
       int x;
       int y;
       void set(int a, int b) {
           x = a;
           y = b;
       }
   };
   ```

1. <strong>Перечисления (</strong>
   <code>enum</code>
   <strong>)</strong>&#58; Наборы именованных целочисленных констант.

   ```cpp
   enum Color { RED, GREEN, BLUE };
   ```

#### Указатели и ссылки&#58;

1. <strong>Указатели</strong>&#58; Хранение адресов других переменных.

   ```cpp
   int* ptr;
   ```

1. <strong>Ссылки</strong>&#58; Альтернативные имена для существующих
   переменных.

   ```cpp
   int& ref = someInt;
   ```

:::note[Ссылки для изучения]

1. [Типы данных в C++](https://education.yandex.ru/handbook/cpp/article/data-types)
   :::

---

## <strong>Что такое инкапсуляция? Как она реализуется в C++?</strong> [#q-14bee738d69b815dae83ce9ec6f4de09]

Инкапсуляция — это принцип объектно-ориентированного программирования, заключающийся в скрытии внутреннего состояния объекта и предоставлении доступа к нему только через публичные методы. Это помогает защитить данные от некорректного использования и упрощает управление сложными системами.

В C++ инкапсуляция реализуется с помощью модификаторов доступа&#58;

1. <code>private</code>&#58; Данные и методы доступны только внутри класса.

1. <code>protected</code>&#58; Данные и методы доступны внутри класса и его
   наследников.

1. <code>public</code>&#58; Данные и методы доступны из любого места программы.

Пример&#58;

```cpp
class MyClass {
private:
    int privateVar;  // Доступен только внутри MyClass

protected:
    int protectedVar;  // Доступен в MyClass и его наследниках

public:
    void setVar(int value) {  // Публичный метод для изменения privateVar
        privateVar = value;
    }

    int getVar() {  // Публичный метод для доступа к privateVar
        return privateVar;
    }
};
```

В этом примере <code>privateVar</code> скрыт от внешнего мира, а доступ к нему осуществляется через публичные методы <code>setVar</code> и <code>getVar</code>.

:::note[Ссылки для изучения]

1. [Управления доступом. Инкапсуляция](https://metanit.com/cpp/tutorial/5.4.php)
   :::

---

## <strong>Какие есть встроенные типы в С++?</strong> [#q-14bee738d69b81f0b9b2c6bb4352fad5]

В C++ есть несколько встроенных (примитивных) типов данных, которые делятся на несколько категорий&#58;

{/* prettier-ignore */}
1. <strong>Целочисленные типы</strong>&#58;

    - <code>int</code>

    - <code>short</code>

    - <code>long</code>

    - <code>long long</code>

    - <code>unsigned</code> версии этих типов (например, <code>unsigned int</code>)

1. <strong>Символьные типы</strong>&#58;

    - <code>char</code>

    - <code>unsigned char</code>

    - <code>signed char</code>

    - <code>wchar&#95;t</code>

    - <code>char16&#95;t</code>

    - <code>char32&#95;t</code>

1. <strong>Типы с плавающей точкой</strong>&#58;

    - <code>float</code>

    - <code>double</code>

    - <code>long double</code>

1. <strong>Булевый тип</strong>&#58;

    - <code>bool</code>

1. <strong>Тип пустого значения</strong>&#58;

    - <code>void</code>

Эти типы данных являются основными строительными блоками для создания более сложных структур данных и программ на C++.

:::note[Ссылки для изучения]

1. [Типы данных. C++](https://metanit.com/cpp/tutorial/2.3.php)
   :::

---

## Что такое <code>enum</code>? [#q-14bee738d69b818fa5a5f7a706f3281c]

<code>enum</code> (перечисление) в C++ — это пользовательский тип данных,
который используется для создания набора именованных целочисленных констант.
Перечисления позволяют сделать код более читаемым и понятным, ассоциируя
целочисленные значения с осмысленными именами.

Пример использования <code>enum</code>&#58;

```cpp
enum Color {
    RED,    // 0
    GREEN,  // 1
    BLUE    // 2
};

// Использование
Color myColor = GREEN;
```

По умолчанию, значения элементов <code>enum</code> начинаются с 0 и увеличиваются на 1 для каждого последующего элемента. Можно также задать конкретные значения&#58;

```cpp
enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 4
};
```

:::note[Ссылки для изучения]

1. [Перечисления в C++](https://metanit.com/cpp/tutorial/5.9.php)
   :::

---

## <strong>Какая разница между структурой и классом?</strong> [#q-14bee738d69b81418441d6b78e70216c]

Основные различия между структурой (<code>struct</code>) и классом (<code>class</code>) в C++&#58;

{/* prettier-ignore */}
1. <strong>Модификатор доступа по умолчанию</strong>&#58;

    - В структуре (<code>struct</code>) поля и методы по умолчанию имеют <strong>public</strong> доступ.

    - В классе (<code>class</code>) поля и методы по умолчанию имеют <strong>private</strong> доступ.

1. <strong>Использование</strong>&#58;

    - Структуры часто используются для простых объектов с публичными данными, когда не требуется инкапсуляция или сложное поведение.

    - Классы обычно используются для более сложных объектов, где требуется инкапсуляция, наследование и полиморфизм.

Пример&#58;

```cpp
struct Point {
    int x; // public по умолчанию
    int y;
};

class Rectangle {
private:
    int width;  // private по умолчанию
    int height;

public:
    void setDimensions(int w, int h) {
        width = w;
        height = h;
    }
    int getArea() {
        return width * height;
    }
};
```

:::note[Ссылки для изучения]

1. [Структуры в C](https://metanit.com/c/tutorial/6.1.php)
   :::

---

## <strong>В чем разница между</strong> <code>private</code> <strong>/</strong> <code>protected</code> <strong>/</strong> <code>public</code> <strong>и где они используются?</strong> [#q-14bee738d69b81439f36d117131d562c]

В C++ модификаторы доступа <code>private</code>, <code>protected</code> и <code>public</code> определяют уровень доступа к членам класса (поля и методы)&#58;

{/* prettier-ignore */}
1. <code>private</code>&#58;

    - <strong>Доступ</strong>&#58; Только внутри самого класса.

    - <strong>Использование</strong>&#58; Для скрытия деталей реализации и защиты данных от прямого доступа извне.

    - <strong>Пример</strong>&#58;

        ```cpp
        class MyClass {
        private:
            int secret;
        };
        ```

1. <code>protected</code>&#58;

    - <strong>Доступ</strong>&#58; Внутри самого класса и его производных классов (наследников).

    - <strong>Использование</strong>&#58; Для защиты данных и методов, которые не должны быть доступны извне, но могут быть полезны в подклассах.

    - <strong>Пример</strong>&#58;

        ```cpp
        class BaseClass {
        protected:
            int protectedValue;
        };
        ```

1. <code>public</code>&#58;

    - <strong>Доступ</strong>&#58; Доступен отовсюду.

    - <strong>Использование</strong>&#58; Для интерфейсов класса, которые должны быть доступны внешнему коду.

    - <strong>Пример</strong>&#58;

        ```cpp
        class MyClass {
        public:
            int value;
        };
        ```

:::note[Ссылки для изучения]

1. [Управление доступом в C++](https://metanit.com/cpp/tutorial/5.4.php)
   :::

---

## <strong>Какие методы класса являются стандартными для класса?</strong> [#q-14bee738d69b811d9bcae777bebbacbd]

Специальные функции-члены включают конструкторы, операторы копирования и перемещения и деструктор. Правила их неявного объявления зависят друг от друга&#58; собственные конструкторы подавляют автоматический конструктор по умолчанию, а объявление деструктора или операций копирования может подавить неявное перемещение. Некоторые defaulted-функции оказываются deleted.

{/* prettier-ignore */}
1. <strong>Конструктор по умолчанию</strong>&#58;

    - Позволяет создать объект без аргументов. Члены классов инициализируются по своим правилам; встроенные поля без начального значения при default-initialization могут остаться неинициализированными.

    ```cpp
    class MyClass {
    public:
        MyClass() = default;  // Явное указание конструктора по умолчанию
    };
    ```

1. <strong>Конструктор копирования</strong>&#58;

    - Создаёт новый объект как копию существующего.

    ```cpp
    class MyClass {
    public:
        MyClass(const MyClass& other) = default;  // Явное указание конструктора копирования
    };
    ```

1. <strong>Оператор присваивания копированием</strong>&#58;

    - Присваивает значения одного объекта другому объекту того же класса.

    ```cpp
    class MyClass {
    public:
        MyClass& operator=(const MyClass& other) = default;  // Явное указание оператора присваивания копированием
    };
    ```

1. <strong>Конструктор перемещения</strong>&#58;

    - Инициализирует новый объект из rvalue. Перенос ресурсов зависит от реализации; для типов стандартной библиотеки перемещённый объект обычно остаётся в корректном, но неуточнённом состоянии, если не оговорено иное. Для пользовательского типа контракт задаёт его автор.

    ```cpp
    class MyClass {
    public:
        MyClass(MyClass&& other) = default;  // Явное указание конструктора перемещения
    };
    ```

1. <strong>Оператор присваивания перемещением</strong>&#58;

    - Присваивает ресурсы одного объекта другому объекту того же класса с перемещением.

    ```cpp
    class MyClass {
    public:
        MyClass& operator=(MyClass&& other) = default;  // Явное указание оператора присваивания перемещением
    };
    ```

1. <strong>Деструктор</strong>&#58;

    - Уничтожает объект, освобождая ресурсы, которые он мог использовать.

    ```cpp
    class MyClass {
    public:
        ~MyClass() = default;  // Явное указание деструктора
    };
    ```

:::note[Ссылки для изучения]

1. [Классы в C++](https://education.yandex.ru/handbook/cpp/article/classes)
   :::

---

## <strong>Что такое абстрактный класс, и зачем он нужен?</strong> [#q-14bee738d69b81b785bbefac219f70e4]

Абстрактный класс в C++ — это класс, содержащий хотя бы одну чисто виртуальную функцию (<code>&#61; 0</code>). Он не может быть инстанцирован и используется для создания базовых классов, определяющих интерфейсы для наследования и реализации в производных классах. Это помогает обеспечить полиморфизм и структурировать код.

:::note[Ссылки для изучения]

1. [Классы в C++](https://education.yandex.ru/handbook/cpp/article/classes)
   :::

---

## <strong>Сколько занимает памяти объект пустой класс</strong> <code>class B&#123;&#125;&#59;</code> <strong>?</strong> [#q-14bee738d69b811c8b97d4e213db7b58]

В C++, объект пустого класса <code>class B &#123;&#125;</code> занимает не менее 1 байта памяти. Это делается для того, чтобы у каждого объекта класса был уникальный адрес, необходимый для правильной работы с объектами, особенно в контексте массивов и указателей.

Пример&#58;

```cpp
class B {};
B obj;
std::cout << sizeof(obj);  // Выведет 1
```

:::note[Ссылки для изучения]

1. [Классы в C++](https://education.yandex.ru/handbook/cpp/article/classes)
   :::

---

## <strong>Что станет с функцией, если к ней добавить ключевое слово</strong> <code>static</code><strong>? В контексте члена класса? В контексте метода класса?</strong> [#q-14bee738d69b81ffab90eaaf6e6af2de]

<strong>В контексте глобальной функции</strong>&#58;

- Функция становится видимой только в пределах файла, в котором она определена (внутреннее связывание).

<strong>В контексте метода класса</strong>&#58;

- Метод становится статическим методом класса, который&#58;
  - Не имеет указателя this. Может обращаться к нестатическим членам через явно переданный объект, ссылку или указатель на него.

  - Может быть вызван без создания экземпляра класса.

  - Общий для всех объектов класса.

Пример&#58;

```cpp
class MyClass {
public:
    static void staticMethod() {
        // Доступ только к статическим членам класса
    }
};
```

:::note[Ссылки для изучения]

1. [Статические члены класса в C++](https://metanit.com/cpp/tutorial/5.7.php)
   :::

---

## <strong>В чём разница между кучей и стеком?</strong> [#q-14bee738d69b814b97abf460044c7117]

Основные различия между двумя областями памяти&#58;

{/* prettier-ignore */}
1. <strong>Куча</strong> <code>&#40;Heap&#41;</code>&#58;

    - Динамической памятью можно управлять через RAII, контейнеры и умные указатели; прямые new и delete также доступны.

    - Динамическое выделение памяти.

    - Глобальный доступ.

    - Более медленный доступ.

1. <strong>Стек</strong> <code>&#40;Stack&#41;</code>&#58;

    - Управляется автоматически (локальные переменные).

    - Автоматическая длительность хранения локальных объектов. Это не статическая длительность хранения, которую задаёт static.

    - Локальный доступ (в пределах функции).

    - Быстрый доступ.

Пример&#58;

```cpp
int main() {
    int a = 10;          // В стеке
    int* p = new int;    // В куче
    delete p;            // Освобождение памяти в куче
}
```

:::note[Ссылки для изучения]

1. [Основные принципы программирования. Стек и куча](https://tproger.ru/translations/programming-concepts-stack-and-heap)
   :::
