Comments 29
В описании вакансий часто можно встретить 2 отдельных требования — знание C++ и знакомство с STL.
Смею предположить, что когда STL фигурирует в вакансии, ожидается не только знакомство, но и знание внутреннего устройства базовых реализаций контейнеров/алгоритмов и скорости работы. Однажды проходил собеседование без должной подготовки и не смог рассказать ничего внятного про std::map (спойлер: не прошёл).
За подборку большое спасибо.
Удобно при работе c POD
CV — const volatile (qualifiers)
ABI — упомянута но не раскрыта
LTO — оптимизация линковки
PCH — pre compiled header
PGO — оптимизация по результатам профайлинга
SEH\VEH — обработчики исключений (win)
VLA — фича из C но употрбляется и в С++ контексте
Значение аргументов по умолчанию — зло :) Поубивал бы людей, которые их придумали) Столько дебильных багов из-за них словлено и отыскать их в коде оч трудно глазами.
Особенно они хороши в таких замечательных вещах, как виртуальные функции :) Например что выведет этот код:
struct A {
virtual void foo(int a = 5)
{
std::cout << a << std::endl;
}
};
struct B : A
{
void foo(int a = 7) override
{
std::cout << a*2 << std::endl;
}
};
A a;
B b;
auto pa = dynamic_cast<A*>(&b);
pa->foo();
В целом, никакого глубокого познания в С++ не требуется, чтобы понять что этот код должен вывести, но в первый раз я впал в ступор потому что даже после пяти лет на плюсах я был НЕ УВЕРЕН в ответе, хоть и дал его правильный, когда спрашивали :)
В общем, подводных камней везде хватает, просто к C++ я уже привык.
Были б безболезненные типы может и багов было чуточку меньше.
Ну, тогда стоит отметить, что помимо аргументов по умолчанию, статически привязана и сигнатура функции. Несмотря на то, что вызывается B::foo(), мы об этом узнаем только в рантайме, поэтому не будет работать следующий код:
struct A {
// Нет аргумента по умолчанию!
virtual void foo(int a) {
std::cout << a << std::endl;
}
};
struct B : A {
void foo(int a = 7) override {
std::cout << a*2 << std::endl;
}
};
A a;
B b;
auto pa = dynamic_cast<A*>(&b);
pa->foo(); //Ошибка в сигнатуре A::foo(), нет default аргумента.
В недостатках CRTP
И вообще, у потомков есть публичные методы, которые нигде, кроме базового класса, использоваться не должны. Это нехорошо, но исправляется через дополнительный уровень абстракции (см. FTSE во второй части).
А что мешает писать так?
class Derived : Base<Derived>
{
private:
friend Base<Derived>;
void actionImpl() const { ... }
};
Ой! Оказывается они во второй части описаны.
Еще не хватает Ro5 - Rule of 5.
Перед каждым собеседование перечитываю. Спасибо за ясное изложение)
Шпаргалка по аббревиатурам C++ и не только. Часть 1: C++