TGViewer
Channel Public Channel
С++ Собеседования

С++ Собеседования

@cppsobes

по всем вопросам @haarrp
Subscribers
732
Photos
33
Videos
0
Links
2
Recent Posts 20 shown
Post #72 1.05K
Post #71 1.45K
Post #70 1.26K
Post #68 1.32K
Что выведет код ?
  • 👀 8
  • ❤ 2
Post #67 1.34K
  • 👍 3
  • ❤ 1
Post #65 1.23K
🧠 Задача с подвохом для продвинутых C++ разработчиков

🔹 Уровень: Advanced
🔹 Темы: std::vector, управление памятью, конструкторы/деструкторы, reserve() vs resize()

📌 Условие

Рассмотрим следующий код:


#include <iostream>
#include <vector>

struct Foo {
Foo() { std::cout << "Ctor\n"; }
~Foo() { std::cout << "Dtor\n"; }
Foo(const Foo&) { std::cout << "Copy\n"; }
Foo(Foo&&) noexcept { std::cout << "Move\n"; }
};

int main() {
std::vector<Foo> v;
v.reserve(3); // Резервируем место под 3 элемента

std::cout << "--- Pushing ---\n";
for (int i = 0; i < 3; ++i) {
v.push_back(Foo());
}

std::cout << "--- Done ---\n";
}


Вопросы

1. Что будет выведено на экран?
2. Почему reserve() не предотвращает конструкторы копирования/перемещения?
3. Что изменится, если заменить reserve(3) на resize(3)?

🔍 Разбор

Ожидаемый вывод:

--- Pushing ---
Ctor
Move
Dtor
Ctor
Move
Dtor
Ctor
Move
Dtor
--- Done ---
Dtor
Dtor
Dtor


🔧 Почему так происходит

- Foo() создаёт временный объект.
- push_back() вызывает перемещающий конструктор Move.
- Временный объект уничтожается (вызывается `Dtor`).
- reserve(3) выделяет память, но не создаёт объектов.

🔄 Если заменить `reserve(3)` на `resize(3)`

- resize(3) создаст 3 объекта Foo через конструктор по умолчанию.
- push_back(Foo()) добавит четвёртый, возможно вызовет realocation.
- Это может привести к копированию или перемещению уже созданных элементов.

⚠️ Подвох

Многие ошибочно считают, что reserve(n) создаёт n объектов. Но это не такreserve() только выделяет память, не вызывая конструкторы. Именно поэтому внутри push_back всё равно происходит перемещение или копирование.

🧠 Вывод

- reserve() — экономия на реаллокациях, без создания объектов.
- resize() — создаёт n объектов, вызывает конструкторы.
- Не путай эти методы — от этого зависит и производительность, и семантика.


// Резервирует память, не создаёт объекты
v.reserve(10);

// Создаёт 10 объектов Foo
v.resize(10);


📌 Совет:
Если не хочешь лишнего перемещения, используй emplace_back():


v.emplace_back(); // Вызывает конструктор Foo напрямую внутри вектора
  • 👍 6
  • ❤ 2
Post #64 1.02K
🔓Что выведет следующий код?


#include <iostream>
using namespace std;

class Base {
public:
Base() {
cout << "Base constructor: ";
call();
}
virtual void call() { cout << "Base::call\n"; }
};

class Derived : public Base {
int x = init();

int init() {
cout << "Derived::init\n";
return 42;
}

public:
Derived() {
cout << "Derived constructor\n";
}

void call() override {
cout << "Derived::call, x = " << x << "\n";
}
};

int main() {
Derived d;
return 0;
}


🔢Варианты ответа:

A)

Derived::init
Derived constructor


B)

Derived::init
Derived constructor


C)

Base constructor: Derived::call, x = 42
Derived constructor


D)

Derived::call, x = <undefined>
Derived::init
Derived constructor


Правильный ответ: B

💡Почему?
В момент вызова конструктора Base, объект ещё не стал Derived. Виртуальная функция вызывается в контексте Base.
  • 👍 1
  • 😁 1
Post #63 903
🔍 Что выведет этот код C++23?


constexpr auto make_checker() {
return [](int x) consteval {
return x % 3 == 0 || x % 5 == 0;
};
}

int main() {
auto checker = make_checker();
std::vector<int> numbers{1, 3, 5, 9, 10, 14, 15};
auto filtered = numbers | std::views::filter([&](int x) {
return checker(x);
});
for (int x : filtered)
std::print("{} ", x);
}


🧠 Попробуй угадать результат — он может удивить!

@cppsobes
  • 🤔 4
  • 👍 1
Post #62 1.52K
  • 👍 3
Post #61 1.43K
Post #60 1.86K
  • 🥴 8
  • 🖕 3
  • ❤‍🔥 2
  • 😁 2
  • ❤ 1
Post #59 1.75K
Post #57 1.83K
  • ❤‍🔥 6
Post #56 1.72K
  • ❤ 4
Post #55 2.05K
  • 🥴 8
  • 👍 5
  • 🤔 4
  • 👨‍💻 1
Post #54 1.75K
#junior
Post #53 1.76K
Post #52 1.63K
#junior
  • 🤔 2
  • ❤ 1
Post #51 1.66K
  • 🤔 2
Older posts →

About this channel

How can I read @cppsobes without a Telegram account?
TGViewer shows the public web preview Telegram publishes for С++ Собеседования: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does С++ Собеседования have?
С++ Собеседования (@cppsobes) has 732 subscribers on Telegram, refreshed roughly every 30 minutes.
Does С++ Собеседования know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →