写点什么

面试高频问题之 C++11 新特性

作者:小万哥
  • 2023-03-20
    广东
  • 本文字数:1709 字

    阅读完需:约 6 分钟

面试高频问题之C++11新特性

背景

C++11 是 C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda 表达式、右值引用、智能指针等等。这些新特性使得 C++更加现代化、高效、易用。也是面试容很容易被问到一个问题,下面我将简要介绍一些 C++11 的新特性:

自动类型推导

C++11 引入了 auto 关键字,可以让编译器自动推导变量的类型。这样可以减少代码中的重复代码,提高代码的可读性和可维护性。例如:


auto i = 42; // 推导为int类型auto d = 3.14; // 推导为double类型auto s = "hello"; // 推导为const char*类型
复制代码

lambda 表达式

C++11 引入了 lambda 表达式,可以方便地定义匿名函数。这样可以减少代码中的重复代码,提高代码的可读性和可维护性。例如:


auto f = [](int x, int y) { return x + y; };int z = f(1, 2); // z的值为3
复制代码

右值引用

C++11 引入了右值引用,可以方便地实现移动语义和完美转发。这样可以提高代码的性能和效率。例如:


class MyString {public:    MyString() : data_(nullptr), size_(0) {}    MyString(const char* str) : data_(new char[strlen(str) + 1]), size_(strlen(str)) {        strcpy(data_, str);    }    MyString(MyString&& other) : data_(other.data_), size_(other.size_) {        other.data_ = nullptr;        other.size_ = 0;    }    ~MyString() {        delete[] data_;    }private:    char* data_;    size_t size_;};
复制代码


更多关于右值引用的内容,感兴趣的小伙伴可以翻看我之前的帖子,有专门的介绍。

智能指针

C++11 引入了智能指针,可以方便地管理动态分配的内存,避免内存泄漏和悬空指针的问题。C++11 中有两种智能指针:std::unique_ptr 和 std::shared_ptr。


std::unique_ptr 是一种独占式智能指针,它拥有对动态分配的对象的唯一所有权。当 std::unique_ptr 被销毁时,它所拥有的对象也会被销毁。例如:


std::unique_ptr<int> p(new int(42));std::cout << *p << std::endl; // 输出42
复制代码


std::shared_ptr 是一种共享式智能指针,它可以被多个指针共享拥有权。当最后一个 std::shared_ptr 被销毁时,它所拥有的对象也会被销毁。例如:


std::shared_ptr<int> p1(new int(42));std::shared_ptr<int> p2 = p1;std::cout << *p1 << " " << *p2 << std::endl; // 输出42 42
复制代码


C++11 的智能指针使得动态内存管理更加方便和安全。

range-based for 循环

C++11 引入了 range-based for 循环,可以方便地遍历容器中的元素。这样可以减少代码中的重复代码,提高代码的可读性和可维护性。例如:


std::vector<int> v = {1, 2, 3, 4, 5};for (auto x : v) {    std::cout << x << std::endl;}
复制代码

nullptr

C++11 引入了 nullptr 关键字,可以代替 NULL 宏定义。这样可以避免一些潜在的错误。例如:


void f(int* p) {}f(nullptr); // 可以编译通过
复制代码

constexpr

C++11 引入了 constexpr 关键字,可以在编译期间计算表达式的值。这样可以提高代码的性能和效率。例如:


constexpr int factorial(int n) {    return n == 0 ? 1 : n * factorial(n - 1);}int x = factorial(5); // x的值为120
复制代码


更多关于 constexpr 的内容,感兴趣的小伙伴可以翻看我之前的帖子,有专门的介绍。

static_assert

C++11 引入了 static_assert 关键字,可以在编译期间检查表达式的值是否为真。这样可以避免一些潜在的错误。例如:


static_assert(sizeof(int) == 4, "int must be 4 bytes"); // 如果sizeof(int)不等于4,编译会失败
复制代码

变长参数模板

C++11 引入了变长参数模板,可以方便地处理可变数量的参数。这样可以提高代码的灵活性和可维护性。例如:


template<typename... Args>void f(Args... args) {    std::cout << sizeof...(args) << std::endl; // 打印参数的数量}f(1, 2, 3); // 打印3f("hello", 3.14); // 打印2
复制代码

线程支持库

C++11 引入了线程支持库,可以方便地创建和管理线程。这样可以提高代码的并发性和可维护性。例如:


#include <iostream>#include <thread>void f() {    std::cout << "hello, world" << std::endl;}int main() {    std::thread t(f); // 创建一个新线程    t.join(); // 等待线程结束    return 0;}
复制代码

结尾

以上是 C++11 的一些新特性,它们使得 C++更加现代化、高效、易用。

发布于: 刚刚阅读数: 3
用户头像

小万哥

关注

还未添加个人签名 2023-02-09 加入

还未添加个人简介

评论

发布
暂无评论
面试高频问题之C++11新特性_c++_小万哥_InfoQ写作社区