c++ 11 新特性-详

1.概要

2.内容

C++11是C++标准的一个重要更新,引入了许多新特性和语言改进。以下是C++11的一些主要新特性:

  1. 自动类型推导(auto)
    • C++11中新增了auto关键字,它可以自动推导变量的类型,从而简化代码。编译器会根据初始化表达式自动推断变量的类型。
  2. 统一的列表初始化
    • 使用大括号{}可以进行统一的列表初始化,这适用于各种STL容器和自定义类型。
  3. 类型推导关键字decltype
    • 除了auto,C++11还引入了decltype关键字,用于在编译时推导表达式的类型。
  4. nullptr关键字
    • 替代了C++03中的NULL宏,nullptr是C++11中的一个新的字面量,用于表示空指针常量。
  5. 范围for循环(range-based for loop)
    • 简化了对容器(如vector、array等)的遍历。
  6. 右值引用和移动语义
    • 右值引用(&&)和移动语义允许在资源管理上更加高效,如移动构造函数和移动赋值操作符。
  7. Lambda表达式
    • 允许定义匿名函数对象,常用于回调函数和算法中。
  8. 关键字default和delete
    • 允许明确指定类或结构体的成员函数(如构造函数、析构函数、拷贝构造函数、赋值操作符等)的默认实现或删除它们。
  9. 可变参数模板(variadic templates)
    • 允许定义接受任意数量和类型参数的函数模板和类模板。
  10. 线程库
    • C++11引入了线程库,包括线程管理、互斥锁、条件变量等,用于支持多线程编程。
  11. 包装器(std::function)
    • 是一种通用的、多态的函数包装器,可以将任何可调用目标(如函数、lambda表达式、函数对象等)封装为std::function对象,并可以存储、复制和调用它们。
  12. 原子操作
    • 提供了一组原子操作函数和宏,用于多线程环境中的无锁编程。
  13. emplace_back
    • 是某些容器(如std::vector)的新成员函数,它允许在容器内部直接构造元素,避免了不必要的拷贝或移动操作。

这些新特性大大提高了C++语言的易用性、安全性和性能,使得C++在现代软件开发中更加具有竞争力。

3.关联知识 

1.包装器(std::function) 

std::function 是 C++11 引入的一个标准库模板类,用于封装任何可以调用的目标(callable target)。它提供了一种通用的、类型安全的方式来存储和调用函数、lambda 表达式、绑定表达式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针。std::function 使得函数可以作为一等公民在 C++ 中被使用和传递。

主要特性

  1. 通用性std::function 可以封装几乎任何类型的可调用对象,包括普通函数、lambda 表达式、std::bind 结果、函数指针、以及具有 operator() 的对象。

  2. 类型擦除std::function 通过类型擦除(type erasure)技术,使得不同类型的可调用对象可以被统一存储和调用,而无需关心其具体类型。

  3. 空状态std::function 可以表示一个“空”状态,即没有封装任何可调用对象。此时调用它将引发 std::bad_function_call 异常。

使用示例

#include <iostream>
#include <functional>

void foo(int x) {
    std::cout << "foo(" << x << ")" << std::endl;
}

int main() {
    // 封装普通函数
    std::function<void(int)> f1 = foo;
    f1(42);  // 输出:foo(42)

    // 封装 lambda 表达式
    std::function<void(int)> f2 = [](int x) {
        std::cout << "lambda(" << x << ")" << std::endl;
    };
    f2(42);  // 输出:lambda(42)

    // 封装 std::bind 结果
    auto boundFunc = std::bind([](int x, const std::string& str) {
        std::cout << str << "(" << x << ")" << std::endl;
    }, std::placeholders::_1, "bound function");
    std::function<void(int)> f3 = boundFunc;
    f3(42);  // 输出:bound function(42)

    // 检查是否为空
    std::function<void(int)> f4;
    if (!f4) {
        std::cout << "f4 is empty" << std::endl;
    }

    return 0;
}

注意事项

  1. 性能开销:由于 std::function 使用了类型擦除和动态内存分配,它可能带来一定的性能开销。在性能敏感的场合,应谨慎使用。

  2. 异常安全性:当 std::function 被复制或移动时,如果它封装了一个抛出异常的可调用对象,那么这些操作可能会抛出异常。

  3. 空 std::function 的调用:调用一个空的 std::function 将导致 std::bad_function_call 异常被抛出。

std::function 是 C++11 中一个非常强大的特性,它极大地增强了 C++ 中函数和可调用对象的灵活性和可用性。通过 std::function,我们可以更方便地编写泛型代码,以及实现回调、事件处理等功能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值