c++11新特性(总结中)

2023-12-13 17:33:01

一、自动类型推导(auto)

原理:auto关键字可以根据变量的初始化表达式自动推导出变量的类型。

auto x = 10; // x的类型被推导为int
auto y = 3.14; // y的类型被推导为double
auto z = "Hello"; // z的类型被推导为const char*

二、Lambda表达式

原理:Lambda表达式是一种匿名函数,可以在需要函数对象的地方使用,提供了一种更加灵活的函数定义方式。

// Lambda表达式的基本语法:[捕获列表](参数列表) -> 返回类型 { 函数体 }
auto sum = [](int a, int b) -> int { return a + b; };
int result = sum(3, 4); // 调用Lambda表达式

三、右值引用(rvalue reference)

原理:右值引用是一种新的引用类型,用于支持移动语义和完美转发,提高代码的效率。

int x = 5;
int&& rref = 10; // 右值引用绑定到右值
int&& rref2 = std::move(x); // 使用std::move将左值转换为右值引用

四、初始化列表(initializer list)

原理:初始化列表可以用于初始化数组、容器等数据结构,提供了一种简洁的初始化方式。

std::vector<int> numbers = {1, 2, 3, 4, 5}; // 使用初始化列表初始化vector
int arr[] = {1, 2, 3, 4, 5}; // 使用初始化列表初始化数组

五、线程库(thread library)

原理:C++11引入了std::thread类和相关函数,用于创建和管理线程,实现并发编程。

#include <iostream>
#include <thread>

void printHello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(printHello); // 创建一个新线程并执行printHello函数
    t.join(); // 等待线程执行完毕
    return 0;
}

六、智能指针(smart pointer)

原理:智能指针是一种包装原始指针的类模板,可以自动管理内存,避免内存泄漏和悬空指针等问题。

#include <memory>

std::shared_ptr<int> ptr = std::make_shared<int>(10); // 创建一个shared_ptr
std::unique_ptr<int> ptr2 = std::make_unique<int>(20); // 创建一个unique_ptr

七、新的容器和算法

C++11引入了一些新的容器和算法,如unordered_map、unordered_set、move、emplace等,提高了代码的效率和可读性。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> scores;
    scores["Alice"] = 90;
    scores["Bob"] = 80;
    scores["Charlie"] = 70;

    for (const auto& pair : scores) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

八、constexpr函数

原理:constexpr函数是一种可以在编译期间求值的函数,用于定义常量表达式函数,提高代码的效率。

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

int main() {
    constexpr int result = factorial(5); // 在编译期间求值
    std::cout << "Factorial of 5: " << result << std::endl;
    return 0;
}```
## 九、静态断言(static_assert)
 原理:静态断言可以在编译期间检查代码的正确性,如果断言条件为假,则编译错误。 
 

```cpp
template <typename T>
void process(T value) {
    static_assert(std::is_integral<T>::value, "T must an be integral type");
    // ...
}

int main() {
    process(10); // 正常调用
    process(3.14); // 静态断言失败,编译错误
    return 0;
}

文章来源:https://blog.csdn.net/weixin_47343978/article/details/134895423
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。