Основные компоненты STL в C++ обеспечивают инструменты для эффективного программирования.
1. Контейнеры
Хранят и организуют данные. Основные типы:
- vector – динамический массив.
::vector<int> nums = {1, 2, 3};
- map – ассоциативный массив с ключами и значениями.
std::map<std::string, int> age = {{"Alice", 30}, {"Bob", 25}};
- list – двусвязный список.
2. Алгоритмы
Предоставляют общие операции над данными, такие как сортировка, поиск и трансформация.
- std::sort – сортирует элементы.
::sort(nums.begin(), nums.end());
- std::find – ищет элемент.
auto it = std::find(nums.begin(), nums.end(), 2);
3. Итераторы
Обеспечивают универсальный доступ к элементам контейнеров, аналог указателей.
- Пример использования итератора:
for(auto it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << " ";
}
4. Функторы
Объекты, которые можно вызывать как функции, используемые в алгоритмах.
struct Compare {
bool operator()(int a, int b) { return a < b; }
};
std::sort(nums.begin(), nums.end(), Compare());
5. Аллокаторы
Управляют памятью для контейнеров, позволяют настраивать стратегии выделения.
Использование компонентов STL повышает эффективность разработки и качество кода в C++.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
std::unique_ptr
и std::shared_ptr
являются умными указателями в C++, обеспечивающими автоматическое управление динамической памятью, но отличаются механизмами владения и управления ресурсами.std::unique_ptr
Обеспечивает уникальное владение объектом. Нельзя копировать, но можно перемещать.
std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
// std::unique_ptr<int> ptr2 = ptr1; // Ошибка
std::unique_ptr<int> ptr2 = std::move(ptr1); // Перемещение
Преимущества:
- Легковесность.
- Явное владение ресурсом.
- Подходит для строгого владения объектом.
std::shared_ptr
Позволяет совместное владение объектом с подсчетом ссылок. Объект удаляется, когда последний
shared_ptr
уничтожается.
std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
std::shared_ptr<int> ptr2 = ptr1; // Совместное владение
Преимущества:
- Удобно для разделяемых ресурсов.
- Автоматическое управление временем жизни объекта.
Отличия:
-
unique_ptr
имеет эксклюзивное владение и меньше накладных расходов.-
shared_ptr
поддерживает совместное владение, что требует дополнительного памяти для хранения счетчика ссылок.Выбор между ними зависит от требований к владению ресурсом и необходимости совместного использования объекта.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Арифметика указателей позволяет выполнять операции с адресами памяти, учитывая размер типа данных.
Основные операции:
1. Инкремент (++) – увеличивает адрес на размер типа данных.
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
ptr++; // указывает на arr[1]
2. Декремент (--) – уменьшает адрес на размер типа данных.
ptr--; // возвращается к arr[0]
3. Сложение (+) – смещает указатель на указанное количество элементов.
ptr = ptr + 2; // указывает на arr[2]
4. Вычитание (-) – смещает указатель назад.
ptr = ptr - 1; // указывает на arr[1]
5. Разность указателей – вычисляет количество элементов между двумя указателями.
int* start = arr;
int* end = arr + 5;
ptrdiff_t diff = end - start; // diff = 5
Особенности:
- Арифметика указателей обычно используется с массивами.
- Указатели должны принадлежать одному массиву для корректной разности.
- Операции учитывают размер типа данных, на который указывает указатель.
Арифметика указателей упрощает навигацию по массивам и работу с динамическими структурами данных в C++.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Условные переменные (std::condition_variable) позволяют потокам ждать наступления определённого условия, обеспечивая эффективную синхронизацию.
Основные компоненты:
1. std::mutex – обеспечивает взаимное исключение при доступе к общим данным.
2. std::condition_variable – позволяет потокам блокироваться и ожидать уведомления.
3. Условия – логические выражения, определяющие, когда поток может продолжить выполнение.
Пример использования:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; });
std::cout << "Работа началась\n";
}
int main() {
std::thread t(worker);
// Подготовка
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // Уведомление потока
t.join();
return 0;
}
Ключевые моменты:
- Блокировка mutex перед ожиданием.
- wait автоматически разблокирует mutex и блокирует поток до уведомления.
- notify_one или notify_all для пробуждения ожидающих потоков.
- Использование лямбда-функции для проверки условия, предотвращая ложные пробуждения.
Условные переменные эффективно управляют синхронизацией потоков, позволяя ожидать специфических событий без постоянной проверки условий.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
std::list
представляет собой двусвязный список, входящий в STL, который обеспечивает эффективные операции вставки и удаления элементов в любом месте списка.Основные характеристики:
- Двунаправленность: Каждый элемент хранит ссылки на предыдущий и следующий элементы, что позволяет легко перемещаться в обоих направлениях.
- Динамическое управление памятью: Элементы не расположены в непрерывной области памяти, что позволяет быстро вставлять и удалять элементы без перераспределения.
- Итераторы: Поддерживает двунаправленные итераторы для перебора элементов.
- Операции: Предоставляет операции вставки, удаления, слияния и разворота списков с линейной сложностью времени.
Пример использования:
#include <iostream>
#include <list>
int main() {
std::list<int> numbers = {1, 2, 3, 4, 5};
// Вставка элемента
numbers.insert(++numbers.begin(), 10);
// Удаление элемента
numbers.erase(--numbers.end());
// Перебор элементов
for(const auto& num : numbers) {
std::cout << num << " ";
}
// Вывод: 1 10 2 3 4
return 0;
}
Преимущества:
- Быстрая вставка и удаление элементов в любом месте списка.
- Нет необходимости в перемещении элементов при изменении размера.
Недостатки:
- Более высокий расход памяти из-за хранения дополнительных указателей.
- Медленный доступ к элементам по индексу по сравнению с
std::vector
.std::list
идеально подходит для сценариев, где необходима частая модификация структуры данных, но не требуется быстрый доступ к элементам по индексу.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Stack unwinding – процесс очистки стека вызовов при возникновении исключения. Когда исключение выбрасывается, система начинает разрушать объекты в обратном порядке создания, вызывая их деструкторы до тех пор, пока исключение не будет поймано.
Пример:
#include <iostream>
#include <exception>
class Resource {
public:
Resource() { std::cout << "Resource acquired\n"; }
~Resource() { std::cout << "Resource released\n"; }
};
void func() {
Resource res;
throw std::runtime_error("Error occurred");
}
int main() {
try {
func();
} catch(const std::exception& e) {
std::cout << "Caught exception: " << e.what() << "\n";
}
return 0;
}
Ключевые моменты:
- Автоматическое разрушение объектов: Все локальные объекты в стеке уничтожаются, предотвращая утечки ресурсов.
- Гарантия вызова деструкторов: Даже при возникновении исключений, деструкторы вызываются для корректного освобождения ресурсов.
- Безопасное управление ресурсами: Stack unwinding поддерживает идиому RAII, обеспечивая надежное управление жизненным циклом объектов.
Принцип stack unwinding обеспечивает безопасную обработку исключений, автоматически управляя освобождением ресурсов и поддерживая стабильность программы.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Паттерн Builder (Строитель) используется для поэтапного создания сложных объектов, отделяя конструирование объекта от его представления.
Основные характеристики:
- Поэтапное построение: Объект создаётся шаг за шагом, что повышает гибкость и управляемость.
- Изолирование конструирования: Логика создания объекта отделена от его класса.
- Повторное использование: Один строитель может создавать различные представления объектов.
Пример использования:
#include <iostream>
#include <string>
// Продукт
class House {
public:
std::string foundation;
std::string structure;
std::string roof;
void show() const {
std::cout << "Foundation: " << foundation << "\n"
<< "Structure: " << structure << "\n"
<< "Roof: " << roof << "\n";
}
};
// Абстрактный строитель
class HouseBuilder {
public:
virtual ~HouseBuilder() = default;
virtual void buildFoundation() = 0;
virtual void buildStructure() = 0;
virtual void buildRoof() = 0;
virtual House getHouse() const = 0;
};
// Конкретный строитель
class ConcreteHouseBuilder : public HouseBuilder {
private:
House house;
public:
void buildFoundation() override {
house.foundation = "Concrete Foundation";
}
void buildStructure() override {
house.structure = "Concrete Structure";
}
void buildRoof() override {
house.roof = "Concrete Roof";
}
House getHouse() const override {
return house;
}
};
// Директор
class Director {
private:
HouseBuilder* builder;
public:
void setBuilder(HouseBuilder* b) {
builder = b;
}
House construct() {
builder->buildFoundation();
builder->buildStructure();
builder->buildRoof();
return builder->getHouse();
}
};
int main() {
Director director;
ConcreteHouseBuilder builder;
director.setBuilder(&builder);
House house = director.construct();
house.show();
return 0;
}
Ключевые моменты:
- Director управляет процессом строительства.
- Builder определяет шаги создания объекта.
- ConcreteBuilder реализует конкретные шаги для создания определённого типа объекта.
Паттерн Builder способствует созданию гибких и расширяемых систем, облегчая управление сложными процессами конструирования объектов.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Ошибки, возникающие на этапе компиляции в C++, можно классифицировать следующим образом:
Синтаксические ошибки
Возникают при нарушении грамматики языка. Примеры:
int main() {
std::cout << "Hello World!" // Пропущена точка с запятой
}
Ошибки типов
Связаны с несоответствием типов данных. Пример:
int number = "text"; // Невозможно присвоить строку целочисленной переменной
Семантические ошибки
Происходят, когда код синтаксически верен, но логически неверен. Пример:
int divide(int a, int b) {
return a / b; // Возможное деление на ноль
}
Ошибки объявлений и определений
Включают неопределенные или дублированные объявления функций и переменных. Пример:
extern int value;
int value;
int value; // Дублирование определения переменной
Ошибки шаблонов
Возникают при некорректном использовании шаблонов. Пример:
template <typename T>
T add(T a, T b) {
return a + b;
}
int result = add<int>("5", "10"); // Неверные типы аргументов
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Const-correctness повышает надежность и читаемость кода, гарантируя неизменность данных там, где это необходимо.
Использование const с переменными
Объявление переменных как
const
предотвращает их изменение после инициализации.
const int maxCount = 100;
Константные указатели и ссылки
Передача объектов по ссылке или указателю с
const
гарантирует, что они не будут изменены внутри функции.
void display(const std::string& message);
Константные методы класса
Методы, помеченные как
const
, не изменяют состояние объекта.
class MyClass {
public:
void print() const;
};
Возврат const-значений
Возврат
const
объектов предотвращает их непреднамеренное изменение.
const std::string getName() const;
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Branch prediction — механизм процессора, предугадывающий направление условных переходов для повышения производительности.
Влияние на производительность
Неправильные предсказания приводят к задержкам. Оптимизация кода для повышения вероятности правильного предсказания улучшает скорость выполнения.
Учёт при написании кода
- Упорядочение условий
Располагать наиболее вероятные условия первыми.
if (likelyCondition) {
// Часто выполняемый код
} else {
// Редко выполняемый код
}
- Избегание непредсказуемых ветвлений
Сокращение количества условных операторов.
- Использование однонаправленных ветвлений
Когда возможно, предпочитать структуры кода с меньшим количеством ветвей.
Пример оптимизации:
// Неоптимально
if (error) {
handleError();
}
processData();
// Оптимально
processData();
if (error) {
handleError();
}
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
std::weak_ptr — это умный указатель из библиотеки C++, который предоставляет неблокирующую ссылку на объект, управляемый std::shared_ptr. Он используется для предотвращения циклических зависимостей, которые могут привести к утечкам памяти.
Основное отличие std::weak_ptr от std::shared_ptr заключается в том, что он не увеличивает счетчик ссылок на объект. Это позволяет безопасно проверять, существует ли объект, без продления его времени жизни.
std::weak_ptr часто применяется в сценариях, где необходимо отслеживать объект, но не контролировать его время жизни. Например, в кэше, где объекты могут быть удалены, если на них больше нет сильных ссылок.
Для доступа к объекту через std::weak_ptr используется метод lock(), который возвращает std::shared_ptr. Если объект уже удален, возвращается пустой std::shared_ptr.
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp;
if (auto locked = wp.lock()) {
std::cout << *locked << std::endl;
} else {
std::cout << "Object no longer exists" << std::endl;
}
return 0;
}
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Итераторы в STL — это объекты, которые позволяют перебирать элементы контейнера. Они похожи на указатели и поддерживают операции разыменования и инкремента.
STL предоставляет несколько типов итераторов: input, output, forward, bidirectional и random access. Выбор типа зависит от контейнера и операции.
Для использования итераторов необходимо получить их с помощью методов begin() и end(). Метод begin() возвращает итератор на первый элемент, а end() — на элемент, следующий за последним.
Пример использования итераторов с std::vector:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
В этом примере итератор используется для доступа к элементам вектора и их вывода на экран.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Concepts в C++ — это механизм, введенный в стандарте C++20, который позволяет задавать ограничения на параметры шаблонов. Они помогают улучшить читаемость и диагностику ошибок компиляции, определяя, какие требования должны удовлетворять типы, используемые в шаблонах.
Concepts определяются с помощью ключевого слова
concept
и могут использоваться для ограничения шаблонных параметров через ключевое слово requires
. Это позволяет компилятору проверять, соответствуют ли переданные типы заданным требованиям.Пример использования concepts для ограничения шаблона функции:
#include <concepts>
#include <iostream>
template<typename T>
concept Incrementable = requires(T a) {
++a;
};
template<Incrementable T>
void increment(T& value) {
++value;
}
int main() {
int x = 5;
increment(x);
std::cout << x << std::endl; // Output: 6
return 0;
}
В этом примере concept
Incrementable
определяет, что тип должен поддерживать операцию инкрементации.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Deadlock — это ситуация в многопоточных приложениях, когда два или более потока блокируют друг друга, ожидая освобождения ресурсов, удерживаемых другими потоками. Это приводит к остановке выполнения программы, так как ни один из потоков не может продолжить работу.
Для предотвращения deadlock можно использовать несколько стратегий:
1. Иерархия блокировок: всегда захватывать несколько блокировок в одном и том же порядке.
2. Тайм-ауты: использовать тайм-ауты при попытке захвата блокировок, чтобы избежать бесконечного ожидания.
3. Избегание взаимного ожидания: проектировать систему так, чтобы потоки не удерживали ресурсы, ожидая других.
4. Использование высокоуровневых примитивов: такие как std::lock_guard или std::unique_lock, которые помогают управлять блокировками безопасно.
Пример использования std::lock для предотвращения deadlock:
#include <iostream>
#include <mutex>
#include <thread>
std::mutex m1, m2;
void task1() {
std::lock(m1, m2);
std::lock_guard<std::mutex> lg1(m1, std::adopt_lock);
std::lock_guard<std::mutex> lg2(m2, std::adopt_lock);
std::cout << "Task 1" << std::endl;
}
void task2() {
std::lock(m1, m2);
std::lock_guard<std::mutex> lg1(m1, std::adopt_lock);
std::lock_guard<std::mutex> lg2(m2, std::adopt_lock);
std::cout << "Task 2" << std::endl;
}
int main() {
std::thread t1(task1);
std::thread t2(task2);
t1.join();
t2.join();
return 0;
}
В этом примере используется std::lock для атомарного захвата нескольких мьютексов, что предотвращает deadlock.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Указатели в C++ — это переменные, которые хранят адреса других переменных в памяти. Они позволяют работать с динамической памятью и управлять ресурсами более гибко.
Указатели объявляются с использованием символа
*
. Например, int* ptr
объявляет указатель на целое число. Для получения адреса переменной используется оператор &
, а для доступа к значению по адресу — оператор разыменования *
.Указатели широко используются для передачи больших объектов в функции без копирования, для работы с массивами и динамическим выделением памяти.
Пример использования указателей:
#include <iostream>
void increment(int* ptr) {
(*ptr)++;
}
int main() {
int value = 10;
int* ptr = &value;
increment(ptr);
std::cout << value << std::endl; // Output: 11
return 0;
}
В этом примере указатель
ptr
передается в функцию increment
, которая увеличивает значение переменной value
по адресу, на который указывает ptr
.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
C++ и C# — это два мощных языка программирования, но они имеют значительные различия в синтаксисе, парадигмах и областях применения.
1. Парадигмы программирования:
- C++: Является языком общего назначения, поддерживающим процедурное, объектно-ориентированное и обобщённое программирование. Он предоставляет низкоуровневый контроль над памятью и ресурсами.
- C#: Основной язык для платформы .NET, ориентированный на объектно-ориентированное программирование. Он также поддерживает функциональные элементы и более высокий уровень абстракции.
2. Управление памятью:
- C++: Предоставляет прямой доступ к управлению памятью через указатели и динамическое выделение памяти. Программист несет ответственность за управление памятью, что может привести к утечкам.
- C#: Использует сборщик мусора для автоматического управления памятью, что упрощает разработку и снижает вероятность утечек памяти.
3. Компиляция и выполнение:
- C++: Компилируется в машинный код, что делает его более производительным и подходящим для системного программирования и приложений с высокими требованиями к производительности.
- C#: Компилируется в промежуточный язык (IL), который выполняется на виртуальной машине CLR (Common Language Runtime). Это обеспечивает переносимость между различными платформами, поддерживающими .NET.
4. Стандартные библиотеки:
- C++: Использует стандартную библиотеку C++ (STL), которая предоставляет контейнеры, алгоритмы и итераторы.
- C#: Имеет богатую библиотеку классов .NET, которая включает в себя широкий набор функций для работы с GUI, сетями, базами данных и веб-сервисами.
5. Области применения:
- C++: Часто используется в разработке операционных систем, драйверов, игр и приложений, требующих высокой производительности.
- C#: Популярен в разработке бизнес-приложений, веб-сервисов, десктопных приложений и приложений для Windows.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
std::unique_ptr и std::shared_ptr — это умные указатели в C++, которые управляют динамически выделенной памятью, но имеют разные модели владения.
std::unique_ptr:
- Обеспечивает уникальное владение ресурсом. Только один std::unique_ptr может владеть объектом в любой момент времени.
- Не поддерживает копирование, но поддерживает перемещение, что позволяет передавать владение.
- Используется, когда объект должен иметь единственного владельца, что минимизирует накладные расходы.
Пример использования std::unique_ptr:
#include <memory>
#include <iostream>
int main() {
std::unique_ptr<int> uptr = std::make_unique<int>(42);
std::cout << *uptr << std::endl;
return 0;
}
std::shared_ptr:
- Обеспечивает совместное владение ресурсом. Несколько std::shared_ptr могут владеть одним объектом.
- Использует счетчик ссылок для отслеживания количества владельцев. Объект удаляется, когда счетчик достигает нуля.
- Подходит для сценариев, где объект должен иметь несколько владельцев.
Пример использования std::shared_ptr:
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> sptr1 = std::make_shared<int>(42);
std::shared_ptr<int> sptr2 = sptr1;
std::cout << *sptr1 << " " << *sptr2 << std::endl;
return 0;
}
Выбор между std::unique_ptr и std::shared_ptr зависит от требований к владению и производительности.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
CMake — это кроссплатформенный инструмент автоматизации сборки, который управляет процессом компиляции программного обеспечения. Он генерирует файлы сборки для различных систем, таких как Makefiles для Unix или проектные файлы для Visual Studio.
Преимущества CMake перед Make:
1. Кроссплатформенность: CMake поддерживает множество операционных систем и компиляторов, что делает его идеальным для проектов, которые должны работать на разных платформах.
2. Генерация файлов сборки: CMake генерирует файлы сборки для различных систем, что упрощает интеграцию с различными IDE и инструментами.
3. Модульность и повторное использование: CMake поддерживает модульную структуру, позволяя легко управлять большими проектами и повторно использовать код.
4. Поддержка сложных проектов: CMake может обрабатывать сложные зависимости и конфигурации, что делает его подходящим для крупных проектов.
5. Современные возможности: CMake поддерживает современные практики разработки, такие как автоматическое обнаружение зависимостей и интеграция с системами контроля версий.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8⚡1
Core dump — это файл, содержащий снимок памяти процесса в момент его аварийного завершения. Он создается операционной системой, когда программа сталкивается с критической ошибкой, например, сегментационной ошибкой (segmentation fault). Core dump помогает разработчикам понять, что пошло не так, и исправить ошибку.
Для анализа core dump в C++ обычно используют отладчики, такие как GDB. Чтобы начать анализ, необходимо запустить GDB с исполняемым файлом и core dump:
gdb ./your_program core
После запуска GDB можно использовать команды для исследования состояния программы. Команда
bt
(backtrace) покажет стек вызовов в момент сбоя, что поможет определить, где произошла ошибка. Команда info locals
отобразит локальные переменные в текущем фрейме стека.Важно убедиться, что программа скомпилирована с отладочной информацией (флаг -g в GCC), чтобы анализ был более информативным.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11👨💻1
Перегрузка функций в C++ — это возможность создавать несколько функций с одинаковым именем, но с различными параметрами. Это позволяет использовать одно имя для разных операций, что делает код более читаемым и удобным.
Перегруженные функции должны отличаться либо количеством, либо типами параметров. Компилятор определяет, какую версию функции вызвать, основываясь на аргументах, переданных при вызове.
Пример перегрузки функций:
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
В этом примере функция
add
перегружена для работы как с int
, так и с double
. Перегрузка не может быть основана только на возвращаемом типе функции.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👨💻1