Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Основные понятия

Все темы C++ Developer

Что такое класс?

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

Основные характеристики класса:

  1. Поля: Переменные, хранящие данные объекта.

  2. Методы: Функции, определяющие поведение объекта.

  3. Инкапсуляция: Скрытие данных и предоставление интерфейсов для работы с ними.

  4. Наследование: Возможность создания нового класса на основе существующего.

  5. Полиморфизм: Возможность использовать объекты производных классов через указатели или ссылки на базовые классы.

Пример:

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

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

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

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

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

Примитивные типы данных:

  1. Целочисленные типы:

    • int (обычный целый число)

    • short (короткое целое число)

    • long (длинное целое число)

    • long long (очень длинное целое число)

    • unsigned версии этих типов (беззнаковые целые числа)

  2. Символьные типы:

    • char (символ)

    • unsigned char (беззнаковый символ)

    • signed char (знаковый символ)

    • wchar_t (широкий символ, используется для представления символов Unicode)

    • char16_t (символы Unicode, 16-битные)

    • char32_t (символы Unicode, 32-битные)

  3. Типы с плавающей точкой:

    • float (одинарной точности)

    • double (двойной точности)

    • long double (расширенной точности)

  4. Булевый тип:

    • bool (истина/ложь)
  5. Тип пустого значения:

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

Сложные типы данных:

  1. Массивы: Наборы элементов одного типа.

    int arr[10];
  2. Структуры ( struct ): Пользовательские типы данных, объединяющие различные типы данных.

    struct Point {
        int x;
        int y;
    };
  3. Объединения ( union ): Пользовательские типы данных, где все члены разделяют одну область памяти.

    union Data {
        int i;
        float f;
        char c;
    };
  4. Классы, объявленные через class или struct, поддерживают методы, наследование и полиморфизм. Различаются доступ к членам и вид наследования по умолчанию: private для class, public для struct.

    class Point {
    public:
        int x;
        int y;
        void set(int a, int b) {
            x = a;
            y = b;
        }
    };
  5. Перечисления ( enum ): Наборы именованных целочисленных констант.

    enum Color { RED, GREEN, BLUE };

Указатели и ссылки:

  1. Указатели: Хранение адресов других переменных.

    int* ptr;
  2. Ссылки: Альтернативные имена для существующих переменных.

    int& ref = someInt;

Что такое инкапсуляция? Как она реализуется в C++?

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

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

  1. private: Данные и методы доступны только внутри класса.

  2. protected: Данные и методы доступны внутри класса и его наследников.

  3. public: Данные и методы доступны из любого места программы.

Пример:

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

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

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

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

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


Какие есть встроенные типы в С++?

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

  1. Целочисленные типы:

    • int
    • short
    • long
    • long long
    • unsigned версии этих типов (например, unsigned int)

  2. Символьные типы:

    • char
    • unsigned char
    • signed char
    • wchar_t
    • char16_t
    • char32_t
  3. Типы с плавающей точкой:

    • float
    • double
    • long double
  4. Булевый тип:

    • bool
  5. Тип пустого значения:

    • void

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


Что такое enum?

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

Пример использования enum:

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

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

По умолчанию, значения элементов enum начинаются с 0 и увеличиваются на 1 для каждого последующего элемента. Можно также задать конкретные значения:

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

Какая разница между структурой и классом?

Основные различия между структурой (struct) и классом (class) в C++:

  1. Модификатор доступа по умолчанию:

    • В структуре (struct) поля и методы по умолчанию имеют public доступ.

    • В классе (class) поля и методы по умолчанию имеют private доступ.

  2. Использование:

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

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

Пример:

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;
    }
};

В чем разница между private / protected / public и где они используются?

В C++ модификаторы доступа private, protected и public определяют уровень доступа к членам класса (поля и методы):

  1. private:

    • Доступ: Только внутри самого класса.

    • Использование: Для скрытия деталей реализации и защиты данных от прямого доступа извне.

    • Пример:

      class MyClass {
      private:
          int secret;
      };
  2. protected:

    • Доступ: Внутри самого класса и его производных классов (наследников).

    • Использование: Для защиты данных и методов, которые не должны быть доступны извне, но могут быть полезны в подклассах.

    • Пример:

      class BaseClass {
      protected:
          int protectedValue;
      };
  3. public:

    • Доступ: Доступен отовсюду.

    • Использование: Для интерфейсов класса, которые должны быть доступны внешнему коду.

    • Пример:

      class MyClass {
      public:
          int value;
      };

Какие методы класса являются стандартными для класса?

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

  1. Конструктор по умолчанию:

    • Позволяет создать объект без аргументов. Члены классов инициализируются по своим правилам; встроенные поля без начального значения при default-initialization могут остаться неинициализированными.
    class MyClass {
    public:
        MyClass() = default;  // Явное указание конструктора по умолчанию
    };
  2. Конструктор копирования:

    • Создаёт новый объект как копию существующего.
    class MyClass {
    public:
        MyClass(const MyClass& other) = default;  // Явное указание конструктора копирования
    };
  3. Оператор присваивания копированием:

    • Присваивает значения одного объекта другому объекту того же класса.
    class MyClass {
    public:
        MyClass& operator=(const MyClass& other) = default;  // Явное указание оператора присваивания копированием
    };
  4. Конструктор перемещения:

    • Инициализирует новый объект из rvalue. Перенос ресурсов зависит от реализации; для типов стандартной библиотеки перемещённый объект обычно остаётся в корректном, но неуточнённом состоянии, если не оговорено иное. Для пользовательского типа контракт задаёт его автор.
    class MyClass {
    public:
        MyClass(MyClass&& other) = default;  // Явное указание конструктора перемещения
    };
  5. Оператор присваивания перемещением:

    • Присваивает ресурсы одного объекта другому объекту того же класса с перемещением.
    class MyClass {
    public:
        MyClass& operator=(MyClass&& other) = default;  // Явное указание оператора присваивания перемещением
    };
  6. Деструктор:

    • Уничтожает объект, освобождая ресурсы, которые он мог использовать.
    class MyClass {
    public:
        ~MyClass() = default;  // Явное указание деструктора
    };

Что такое абстрактный класс, и зачем он нужен?

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


Сколько занимает памяти объект пустой класс class B{}; ?

В C++, объект пустого класса class B {} занимает не менее 1 байта памяти. Это делается для того, чтобы у каждого объекта класса был уникальный адрес, необходимый для правильной работы с объектами, особенно в контексте массивов и указателей.

Пример:

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

Что станет с функцией, если к ней добавить ключевое слово static? В контексте члена класса? В контексте метода класса?

В контексте глобальной функции:

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

В контексте метода класса:

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

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

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

Пример:

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

В чём разница между кучей и стеком?

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

  1. Куча (Heap):

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

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

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

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

  2. Стек (Stack):

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

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

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

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

Пример:

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

Эта страница была полезной?