Основные понятия
Что такое класс?
Класс в C++ — это пользовательский тип данных, который объединяет данные (поля) и функции (методы), работающие с этими данными, в одну логическую единицу. Класс используется для создания объектов и инкапсуляции данных и поведения.
Основные характеристики класса:
-
Поля: Переменные, хранящие данные объекта.
-
Методы: Функции, определяющие поведение объекта.
-
Инкапсуляция: Скрытие данных и предоставление интерфейсов для работы с ними.
-
Наследование: Возможность создания нового класса на основе существующего.
-
Полиморфизм: Возможность использовать объекты производных классов через указатели или ссылки на базовые классы.
Пример:
class Point {
public:
int x, y;
void set(int a, int b) {
x = a;
y = b;
}
};
Объекты класса создаются и используются следующим образом:
Point p;
p.set(10, 20);
Какие основные типы данных в C++?
В C++ основные типы данных делятся на несколько категорий:
Примитивные типы данных:
-
Целочисленные типы:
-
int(обычный целый число) -
short(короткое целое число) -
long(длинное целое число) -
long long(очень длинное целое число) -
unsignedверсии этих типов (беззнаковые целые числа)
-
-
Символьные типы:
-
char(символ) -
unsigned char(беззнаковый символ) -
signed char(знаковый символ) -
wchar_t(широкий символ, используется для представления символов Unicode) -
char16_t(символы Unicode, 16-битные) -
char32_t(символы Unicode, 32-битные)
-
-
Типы с плавающей точкой:
-
float(одинарной точности) -
double(двойной точности) -
long double(расширенной точности)
-
-
Булевый тип:
bool(истина/ложь)
-
Тип пустого значения:
void(используется для указания отсутствия значения, например, в функциях)
Сложные типы данных:
-
Массивы: Наборы элементов одного типа.
int arr[10]; -
Структуры (
struct): Пользовательские типы данных, объединяющие различные типы данных.struct Point { int x; int y; }; -
Объединения (
union): Пользовательские типы данных, где все члены разделяют одну область памяти.union Data { int i; float f; char c; }; -
Классы, объявленные через class или struct, поддерживают методы, наследование и полиморфизм. Различаются доступ к членам и вид наследования по умолчанию: private для class, public для struct.
class Point { public: int x; int y; void set(int a, int b) { x = a; y = b; } }; -
Перечисления (
enum): Наборы именованных целочисленных констант.enum Color { RED, GREEN, BLUE };
Указатели и ссылки:
-
Указатели: Хранение адресов других переменных.
int* ptr; -
Ссылки: Альтернативные имена для существующих переменных.
int& ref = someInt;
Что такое инкапсуляция? Как она реализуется в C++?
Инкапсуляция — это принцип объектно-ориентированного программирования, заключающийся в скрытии внутреннего состояния объекта и предоставлении доступа к нему только через публичные методы. Это помогает защитить данные от некорректного использования и упрощает управление сложными системами.
В C++ инкапсуляция реализуется с помощью модификаторов доступа:
-
private: Данные и методы доступны только внутри класса. -
protected: Данные и методы доступны внутри класса и его наследников. -
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++ есть несколько встроенных (примитивных) типов данных, которые делятся на несколько категорий:
-
Целочисленные типы:
-
int -
short -
long -
long long -
unsignedверсии этих типов (например,unsigned int)
-
-
Символьные типы:
-
char -
unsigned char -
signed char -
wchar_t -
char16_t -
char32_t
-
-
Типы с плавающей точкой:
-
float -
double -
long double
-
-
Булевый тип:
-
bool
-
-
Тип пустого значения:
-
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++:
-
Модификатор доступа по умолчанию:
-
В структуре (
struct) поля и методы по умолчанию имеют public доступ. -
В классе (
class) поля и методы по умолчанию имеют private доступ.
-
-
Использование:
-
Структуры часто используются для простых объектов с публичными данными, когда не требуется инкапсуляция или сложное поведение.
-
Классы обычно используются для более сложных объектов, где требуется инкапсуляция, наследование и полиморфизм.
-
Пример:
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 определяют уровень доступа к членам класса (поля и методы):
-
private:-
Доступ: Только внутри самого класса.
-
Использование: Для скрытия деталей реализации и защиты данных от прямого доступа извне.
-
Пример:
class MyClass { private: int secret; };
-
-
protected:-
Доступ: Внутри самого класса и его производных классов (наследников).
-
Использование: Для защиты данных и методов, которые не должны быть доступны извне, но могут быть полезны в подклассах.
-
Пример:
class BaseClass { protected: int protectedValue; };
-
-
public:-
Доступ: Доступен отовсюду.
-
Использование: Для интерфейсов класса, которые должны быть доступны внешнему коду.
-
Пример:
class MyClass { public: int value; };
-
Какие методы класса являются стандартными для класса?
Специальные функции-члены включают конструкторы, операторы копирования и перемещения и деструктор. Правила их неявного объявления зависят друг от друга: собственные конструкторы подавляют автоматический конструктор по умолчанию, а объявление деструктора или операций копирования может подавить неявное перемещение. Некоторые defaulted-функции оказываются deleted.
-
Конструктор по умолчанию:
- Позволяет создать объект без аргументов. Члены классов инициализируются по своим правилам; встроенные поля без начального значения при default-initialization могут остаться неинициализированными.
class MyClass { public: MyClass() = default; // Явное указание конструктора по умолчанию }; -
Конструктор копирования:
- Создаёт новый объект как копию существующего.
class MyClass { public: MyClass(const MyClass& other) = default; // Явное указание конструктора копирования }; -
Оператор присваивания копированием:
- Присваивает значения одного объекта другому объекту того же класса.
class MyClass { public: MyClass& operator=(const MyClass& other) = default; // Явное указание оператора присваивания копированием }; -
Конструктор перемещения:
- Инициализирует новый объект из rvalue. Перенос ресурсов зависит от реализации; для типов стандартной библиотеки перемещённый объект обычно остаётся в корректном, но неуточнённом состоянии, если не оговорено иное. Для пользовательского типа контракт задаёт его автор.
class MyClass { public: MyClass(MyClass&& other) = default; // Явное указание конструктора перемещения }; -
Оператор присваивания перемещением:
- Присваивает ресурсы одного объекта другому объекту того же класса с перемещением.
class MyClass { public: MyClass& operator=(MyClass&& other) = default; // Явное указание оператора присваивания перемещением }; -
Деструктор:
- Уничтожает объект, освобождая ресурсы, которые он мог использовать.
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() {
// Доступ только к статическим членам класса
}
};
В чём разница между кучей и стеком?
Основные различия между двумя областями памяти:
-
Куча
(Heap):-
Динамической памятью можно управлять через RAII, контейнеры и умные указатели; прямые new и delete также доступны.
-
Динамическое выделение памяти.
-
Глобальный доступ.
-
Более медленный доступ.
-
-
Стек
(Stack):-
Управляется автоматически (локальные переменные).
-
Автоматическая длительность хранения локальных объектов. Это не статическая длительность хранения, которую задаёт static.
-
Локальный доступ (в пределах функции).
-
Быстрый доступ.
-
Пример:
int main() {
int a = 10; // В стеке
int* p = new int; // В куче
delete p; // Освобождение памяти в куче
}