← Назад к вопросам

Какие нововведения С++11 использовал?

2.0 Middle🔥 161 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключевые нововведения С++11, которые я активно использую

C++11 революционизировал язык, добавив множество функций, которые кардинально упростили разработку. Вот наиболее важные из них, с которыми я работаю ежедневно:

Auto и типовая дедукция

Ключевое слово auto позволяет компилятору автоматически определять тип переменной, что значительно упрощает код:

// Вместо сложного типа
std::map<std::string, std::vector<int>>::iterator it = myMap.begin();

// Теперь просто
auto it = myMap.begin();

Range-based for циклы

Итерация по контейнерам стала намного более читаемой:

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto num : vec) {
    std::cout << num << " ";
}

Smart pointers (уникальные и общие указатели)

std::unique_ptr и std::shared_ptr автоматически управляют памятью, предотвращая утечки:

std::unique_ptr<MyClass> ptr1(new MyClass());
std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>();
// Память освобождается автоматически

Lambda-функции

Краткое определение анонимных функций прямо в коде:

auto sum = [](int a, int b) { return a + b; };
std::cout << sum(5, 3); // Выведет 8

// С захватом переменных
int multiplier = 3;
auto multiply = [multiplier](int x) { return x * multiplier; };

Инициализация списков

Единообразная инициализация контейнеров и переменных:

std::vector<int> vec = {1, 2, 3, 4, 5};
std::map<std::string, int> map = {{"a", 1}, {"b", 2}};

Rvalue ссылки и move семантика

Позволяют эффективно передавать ресурсы, избегая ненужного копирования:

class Buffer {
    int* data;
public:
    Buffer(Buffer&& other) noexcept : data(other.data) {
        other.data = nullptr; // Передача владения
    }
};

Constexpr

Вычисления на этапе компиляции для оптимизации:

constexpr int factorial(int n) {
    return n <= 1 ? 1 : n * factorial(n - 1);
}

Variadic Templates

Шаблоны с переменным числом параметров:

template<typename... Args>
void print(Args... args) {
    // Обработка произвольного числа аргументов
}

Override и final

Явное управление виртуальным наследованием:

class Base {
    virtual void process() = 0;
};

class Derived : public Base {
    void process() override { } // Ясно, что это переопределение
};

Nullptr

Безопасная замена NULL:

int* ptr = nullptr; // Вместо NULL или 0
if (ptr == nullptr) { }

Все эти возможности делают код более безопасным, читаемым и производительным. C++11 стал переломным моментом в эволюции языка.

Какие нововведения С++11 использовал? | PrepBro