期值(future)

C++11 提供了:

• future——一个句柄,通过它你可以从一个共享的单对象缓冲区中 get() 一个值,可能需要等待某个 promise 将该值放入缓冲区。

• promise——一个句柄,通过它你可以将一个值 put() 到一个共享的单对象缓冲区,可能会唤醒某个等待 future 的 thread。

• packaged_task——一个类,它使得设置一个函数在线程上异步执行变得容易,由 future 来接受 promise 返回的结果。

• async()——一个函数,可以启动一个任务并在另一个 thread 上执行。


2.简化使用
2.1auto 和 decltype

C++11中用auto关键字来支持自动类型推导。用decltype推导表达式类型。头文件:#include<typeinfo>

auto:让编译器在编译器就推导出变量的类型,可以通过=右边的类型推导出变量的类型。(前提是定义一个变量时对其进行初始化)

代码语言:javascript

AI代码解释

auto a = 10; // 10是int型,可以自动推导出a是int

decltype:用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算。(decltypde是不需要推导变量初始化的,根据的是表达式对变量的类型就可以推导。)

代码语言:javascript

AI代码解释

auto varname = value;
decltype(exp) varname = value;
decltype(10.8) x;  //x 被推导成了 double

两者区别:

1,auto用于变量的类型推导,根据初始化表达式的类型来推导变量的类型,常用于简化代码和处理复杂类型。而decltype则用于获取表达式的类型,保留修饰符,并且可以进行表达式求值。

2,auto在初始化时进行类型推导,而decltype直接查询表达式的类型,可以用于任何表达式,包括没有初始化的变量。

3,auto在编译期间确定类型,并且无法更改。而decltype在运行时才确定表达式的类型。

4,auto适用于简单的类型推导,而decltype适用于复杂的类型推导和获取表达式的结果类型。

2.2范围 for

在C++11中,引入了范围for循环(Range-based for loop),它提供了一种简洁而直观的方式来遍历容器、数组、字符串和其他可迭代对象。

代码语言:javascript

AI代码解释

for (auto element : container) {
    // 操作每个元素
}

其中,element 是一个变量,用于存储容器中的每个元素的值。container 是一个可迭代对象,例如数组、标准库容器或自定义容器。

范围for循环的工作原理是,它会自动遍历容器中的每个元素,并将当前元素的值赋给 element 变量,然后执行循环体中的代码块。循环体会针对容器中的每个元素执行一次。

代码语言:javascript

AI代码解释

//实例:
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    for (auto number : numbers) {
        std::cout << number << " ";
    }

    return 0;
}
2.3资源管理指针

在C++11中,引入了新的智能指针类,用于更安全和方便地管理动态分配的资源,避免内存泄漏和悬空指针等问题。以下是C++11中的三种主要智能指针:

【1】std::unique_ptr

1,std::unique_ptr 是一种独占式智能指针,用于管理唯一的对象,确保只有一个指针可以访问该对象。

2,使用 std::unique_ptr 可以自动释放动态分配的内存,当指针超出作用域或被重置时,它会自动删除所管理的对象。

3,通过 std::make_unique 函数可以创建 std::unique_ptr 对象,如:std::unique_ptr<int> ptr = std::make_unique<int>(42);

【2】std: :shared_ptr:

1,std::shared_ptr 是一种共享式智能指针,多个指针可以同时共享对同一对象的拥有权。

2,std::shared_ptr 使用引用计数技术追踪所管理对象的引用数量,当引用计数变为零时,自动销毁所管理的对象。

3,通过 std::make_shared 函数可以创建 std::shared_ptr 对象,如:std::shared_ptr<int> ptr = std::make_shared<int>(42);

【3】std::weak_ptr

1,std::weak_ptr 是一种弱引用智能指针,它可以解决 std::shared_ptr 的循环引用问题。

2,std::weak_ptr 指向 std::shared_ptr 管理的对象,但不会增加引用计数。因此,当所有 std::shared_ptr 对象超出作用域后,即使还有 std::weak_ptr 对象存在,所管理的对象也会被销毁。

3,通过 std::shared_ptrstd::weak_ptr 构造函数可以创建 std::weak_ptr 对象,如:std::weak_ptr<int> weakPtr = sharedPtr;

注意:“它们的确智能,但它们仍然是指针。”除非我们确实需要指针,否则,简单地使用局部变量会更好

参考文章:http://t.csdn.cn/CfDZr

2.4统一初始化

C++11 引入了统一初始化(Uniform Initialization)语法,这使得对象的初始化更加一致和简洁。使用统一初始化,可以通过多种方式来初始化对象,无论是基本类型、类类型还是数组都可以使用相同的语法。

在 C++11 中,统一初始化有以下几种形式:

代码语言:javascript

AI代码解释

int x = 42;  // 直接初始化一个整数
std::string s("Hello");  // 直接初始化一个字符串对象

int y = x;  // 使用拷贝初始化将 x 的值赋给 y
std::vector<int> v = {1, 2, 3};  // 使用拷贝初始化进行向量初始化

int z{123};  // 使用列表初始化一个整数
std::vector<int> nums{1, 2, 3};  // 使用列表初始化初始化一个向量
std::pair<int, double> p{42, 3.14};  // 使用列表初始化初始化一个键值对
2.5nullptr

nullptr是c++11用来表示空指针新引入的常量值,在c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型的0,其实不是个指针。举例:

代码语言:javascript

AI代码解释

void func(void *ptr) {
    cout << "func ptr" << endl;
}

void func(int i) {
    cout << "func i" << endl;
}

int main() {
    func(NULL); // 编译失败,会产生二义性
    func(nullptr); // 输出func ptr
    return 0;
}
2.6constexpr 函数

constexpr 关键字的功能是使指定的常量表达式获得在程序编译阶段计算出结果的能力,而不必等到程序运行阶段。C++ 11 标准中,constexpr 可用于修饰普通变量、函数(包括模板函数)以及类的构造函数。

常量表达式(const experssion)是指:

(1)值不会改变

(2)在编译过程就能得到计算结果的表达式。

constexpr和const的区别:

两者都代表可读,

const只表示read only的语义,只保证了运行时不可以被修改,但它修饰的仍然有可能是个动态变量,

而constexpr修饰的才是真正的常量,它会在编译期间就会被计算出来,整个运行过程中都不可以被改变,constexpr可以用于修饰函数,这个函数的返回值会尽可能在编译期间被计算出来当作一个常量,但是如果编译期间此函数不能被计算出来,那它就会当作一个普通函数被处理。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐