
c++11新特性
文章平均质量分 81
介绍了c++11引入的新特性
Liuuuu408
这个作者很懒,什么都没留下…
展开
-
c++原子变量
C++11提供了一个原子类型std::atomic<T>,通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数(不支持浮点类型和复合类型)。原子指的是一系列不可被CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核CPU下,当某个CPU核心开始运行原子操作时,会先暂停其它CPU内核对内存的操作,以保证原子操作不会被其它CPU内核所干扰。。原创 2023-12-14 11:08:45 · 2586 阅读 · 0 评论 -
c++线程同步之条件变量
wait_until()函数和wait_for()的功能是一样的,它是指定让线程阻塞到某一个时间点,假设阻塞的线程没有被其他线程唤醒,当到达指定的时间点之后,线程就会自动解除阻塞,继续向下执行。wait_for()函数和wait()的功能是一样的,只不过多了一个阻塞时长,假设阻塞的线程没有被其他线程唤醒,当阻塞时长用完之后,线程就会自动解除阻塞,继续向下执行。)的功能是一样的,只不过多了一个阻塞时长,假设阻塞的线程没有被其他线程唤醒,当阻塞时长用完之后,线程就会自动解除阻塞,继续向下执行。原创 2023-12-13 11:13:38 · 1018 阅读 · 0 评论 -
c++互斥锁
这是因为线程在运行的时候需要先得到CPU时间片,时间片用完之后需要放弃已获得的CPU资源,就这样线程频繁地在就绪态和运行态之间切换,更复杂一点还可以在就绪态、运行态、挂起态之间切换,这样就会导致线程的执行顺序并不是有序的,而是随机的混乱的,就如同下图中的这个例子一样,理想很丰满现实却很残酷。 在上面的例子中,通过一个while循环不停的去获取超时互斥锁的所有权,如果得不到就阻塞1秒钟,1秒之后如果还是得不到阻塞50毫秒,然后再次继续尝试,直到获得互斥锁的所有权,跳出循环体。原创 2023-12-12 16:07:21 · 1037 阅读 · 0 评论 -
call_once
比如:要初始化某个对象,而这个对象只能被初始化一次,就可以使用std::call_once()来保证函数在多线程环境下只能被调用一次。通过输出的结果可以看到,虽然运行的三个线程中都执行了任务函数do_something()但是call_once()中指定的回调函数只被执行了一次,我们的目的也达到了。是 C++ 标准库提供的一个函数,用于保证一个函数只会被调用一次,即使在多线程环境下也能确保线程安全。主要用于执行只需要执行一次的初始化操作。原创 2023-12-11 20:38:11 · 1046 阅读 · 0 评论 -
命名空间this_thread
命名空间this_thread中提供了一个非常绅士的函数yield(),在线程中调用这个函数之后,处于运行态的线程会主动让出自己已经抢到的CPU时间片,最终变为就绪态,这样其它的线程就有更大的概率能够抢到CPU时间片了。在C++11中不仅添加了线程类,还添加了一个关于线程的命名空间std::this_thread,在这个命名空间中提供了四个公共的成员函数,通过这些成员函数就可以对当前线程进行相关的操作了。为了能够实现并发处理,多个线程都是分时复用CPU时间片,快速的交替处理各个线程中的任务。原创 2023-12-11 16:58:04 · 540 阅读 · 0 评论 -
c++线程类的使用
C++11之前,C++语言没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在C++11中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。C++11中提供的线程类叫做std::thread,基于这个类创建一个新的线程非常的简单,只需要提供线程函数或者函数对象即可,并且可以同时指定线程函数的参数。原创 2023-12-07 16:04:43 · 948 阅读 · 0 评论 -
Chrono库
C++11中提供了日期和时间相关的库chrono,通过chrono库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下:Rep:这是一个数值类型,用来表示时间段所经历的滴答(tick)数。若 Rep 是浮点数,则 duration 能使用小数描述时钟周期的数目。Period:原创 2023-12-06 15:53:11 · 927 阅读 · 0 评论 -
弱引用能指针 weak_ptr
弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手,它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视shared_ptr中管理的资源是否存在。原创 2023-12-05 16:48:02 · 493 阅读 · 0 评论 -
独占智能指针unique_ptr
头文件:#include智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型。原创 2023-12-04 19:59:34 · 992 阅读 · 0 评论 -
联合体union
掌握了**的使用,我们通过一段程序来演示一下class Basepublic:private:Student()int id;Base tmp;s.name = "蒙奇·D·路飞";s.tmp.setText("我是要成为海贼王的男人!");return 0;Base notes: 我是要成为海贼王的男人!Student name: 我是要成为海贼王的男人!原创 2023-12-01 16:46:07 · 1452 阅读 · 0 评论 -
共享智能指针shared_ptr
如果申请的内存是普通类型,通过函数的()可完成地址的初始化,如果要创建一个类对象,函数的()内部需要指定构造对象需要的参数,也就是类构造函数的参数。另外,我们在初始化智能指针的时候也可以自己指定删除动作,这个删除操作对应的函数被称之为删除器,这个删除器函数本质是一个回调函数,我们只需要进行实现,其调用是由智能指针完成的。在上面的代码中,lambda表达式的参数就是智能指针管理的内存的地址,有了这个地址之后函数体内部就可以完成删除操作了。是最后一个拥有某个对象的智能指针,它会调用对象的析构函数来释放资源。原创 2023-12-03 22:06:19 · 1034 阅读 · 0 评论 -
c++11新特性篇-原始字面量
R"delimiter(raw_characters)delimiter",即:R “xxx(原始字符串)xxx”,其中()两边的字符可以省略,但如果不省略,两边的字符必须一致,否则会报错!第一个字符串regexPattern是使用了原始字面量的形式,可以正常输出 \d{3}-\d{2}-\d{4}此外提醒:()必须有,且()两边的字符串必须相同,但对最后输出没什么影响。当我们要输出的字符串含有转义字符时,可能需要额外对字符串做转义或者连接操作。原创 2023-10-09 16:20:22 · 174 阅读 · 1 评论 -
c++11新特性-long long整形
long long也是一种c++整数数据类型,它提供了至少64位,即8字节的存储空间,通常用来储存非常大的整数值。LL和ll表示 long long类型,ULL或ull表示unsigned long long类型,后缀可以明确指定证书字面量的类型,避免类型转换或截断。早在c++98 和c++03中long long已经存在,但c++11加强了对long long的规定。加上后缀会提高代码的可读性,让读者明确知道这是一个long long类型的值。原创 2023-10-09 21:03:17 · 445 阅读 · 1 评论 -
c++11新特性篇-final和override关键字
上述代码中的Base类声明了虚函数test,子类中重写了该函数并声明为final,因此在孙子类中如果再次重写该函数将会报错。如果派生类中的函数使用了override关键字,但没有正确地覆盖基类中的虚函数,编译器将生成错误。当一个虚函数被声明为final时,表示该虚函数不能在派生类中被重写。主要是为了避免在继承层次中进一步的修改,增加了代码的安全性和稳定性。override关键字主要是用来确保正确书写子类中重写的虚函数。当一个类被声明为final时,它表示该类不能被其他类继承。原创 2023-10-14 22:33:02 · 184 阅读 · 0 评论 -
c++11新特性篇-模板的优化
在这个例子中,sum函数使用了递归展开技术,首先处理第一个参数 first,然后递归处理剩余的参数 args...,直到参数包为空。这一点很简单,之前是在使用模板的时候,两个连续的原创 2023-10-18 21:01:13 · 129 阅读 · 0 评论 -
c++11新特性-静态断言static_assert
首先我讲一下什么是断言,因为在知道静态断言的时候我连断言都不知道是什么。。原创 2023-10-27 16:54:44 · 220 阅读 · 0 评论 -
c++11新特性篇-noexcept
在上篇文章介绍what() 函数的时候提了一下:在介绍noexcept之前,这里先讲一下throw关键字,也就是异常接口声明。原创 2023-10-31 19:23:30 · 137 阅读 · 0 评论 -
c++11新特性篇-自动类型推导(auto, decltype)
auto 是C++11引入的关键字,用于进行自动类型推导。使用 auto 可以在变量声明时省略类型,让编译器根据初始化表达式自动推导变量的类型。这使得代码更加简洁、可读性更高,并且在使用范围较大的情况下,可以提高代码的可维护性。原创 2023-11-03 20:31:32 · 552 阅读 · 0 评论 -
c++11新特性篇-基于范围的for循环
基于范围的 for 循环(Range-based for loop)是C++11引入的新特性。这种循环形式使得遍历容器(如数组、向量、列表等)中的元素变得更加简洁和直观。在C++11之前,我们通常使用传统的 for 循环或迭代器来遍历容器中的元素。其中,container 是一个容器(如数组、向量、列表等),element 是容器中的每个元素。auto 关键字用于自动推导容器中的元素类型。这种循环会遍历容器中的每个元素,将元素赋值给 element,然后执行循环体内的操作。原创 2023-11-06 16:50:31 · 415 阅读 · 0 评论 -
c++11新特性篇-nullptr
C++11 引入了 nullptr 关键字,它是一种空指针常量,用于表示空指针。nullptr 具有明确的类型,可以被赋值给任意指针类型,而不会引发类型转换的歧义。使用 nullptr 可以提高代码的清晰度,避免了与整数零的混淆。这里不写具体的例子了,nullptr还是挺常用的。主要介绍下跟NULL的区别。原创 2023-11-07 10:47:14 · 153 阅读 · 0 评论 -
c++11新特性篇-lambda表达式
Lambda 表达式是C++11引入的新特性。Lambda 表达式允许你在代码中创建匿名函数(或闭包),而不需要单独定义函数。它提供了一种更简洁和方便的方式来编写可调用对象,并且可以捕获外部变量,使得在函数对象中可以使用外部作用域的变量。原创 2023-11-09 20:20:21 · 96 阅读 · 0 评论 -
c++11新特性篇-constexpr
常量表达式函数(constexprfunctions)是指在编译时就能够被计算的函数。在C++11引入了constexpr关键字后,程序员可以声明函数为常量表达式函数,以便在编译时执行,而不是在运行时。这提供了一些性能优势,因为编译时计算可以避免在运行时进行一些重复的计算。constexprconstexpr函数的参数和返回值必须是可以在编译时计算的类型,这通常包括整数、指针等。在调用constexpr函数时,如果传入的参数是常量表达式,那么函数的执行将在编译时完成,结果会被直接嵌入到生成的机器代码中。原创 2023-11-10 20:44:12 · 162 阅读 · 0 评论 -
c++11新特性篇-委托构造函数和继承构造函数
C++11引入了委托构造函数(Delegating Constructor)和C++11及后续标准引入了继承构造函数(Inheriting Constructor)两个特性。原创 2023-11-13 17:19:56 · 980 阅读 · 0 评论 -
c++11新特性篇-右值引用
由于上述代码中**存在T&&或者auto&&这种未定引用类型,当它作为参数时,有可能被一个右值引用初始化,也有可能被一个左值引用初始化,在进行类型推导时右值引用类型(&&)会发生变化,这种变化被称为引用折叠。a=b是一种特殊情况,在这个表达式中a, b都是左值,因为变量b是可以被取地址的,不能视为右值。在C++中在进行对象赋值操作的时候,很多情况下会发生对象之间的深拷贝,如果堆内存很大,这个拷贝的代价也就非常大,在某些情况下,如果想要避免对象的深拷贝,就可以使用右值引用进行性能的优化。原创 2023-11-16 20:11:59 · 248 阅读 · 0 评论 -
移动语义和完美转发
完美转发是 C++11 引入的一个重要特性,它允许在模板中精确地保持函数参数的值类别(左值还是右值),并将它们传递到其他函数。完美转发通常用于实现泛型代码,特别是在编写通用函数模板时非常有用。完美转发的核心在于使用通用引用(Universal Reference)和引用折叠。通用引用的语法是T&&,其中T是模板参数。引用折叠是指在模板类型推导或类型声明的过程中,两个引用(无论是左值引用还是右值引用)可能折叠成一个引用。// 用于演示的一个简单处理函数// 完美转发函数模板。原创 2023-11-20 15:17:42 · 231 阅读 · 0 评论 -
c++11新特性篇-列表初始化
列表初始化是 C++11 引入的一个新特性。**它允许使用花括号{}来初始化变量、数组、结构体等。**列表初始化具有更加统一和直观的语法,同时也提供了一些优势,例如防止窄化转换(narrowing conversion)等。int x{42};// 初始化整数变量 x 为 42// 初始化整数数组 arr 为 {1, 2, 3}int x;int y;// 初始化结构体 Point 的对象 p 的成员 x 和 y// 初始化整数向量 vec 为 {1, 2, 3}原创 2023-11-22 14:29:09 · 289 阅读 · 0 评论 -
c++11新特性篇-using的使用
在 C++11 之前就有,但在 C++11 中引入了一些扩展和新的用法。在 C++中可以通过 typedef 重定义一个类型,语法格式如下:被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。再看一个复杂点的例子:上面两行代码将 定义为 的别名,所以后续使用 就相当于使用 。将 定义为 的别名,而 定义为 的别名,即指向 (也就是 )类型的指针。综合起来就是:using在使用的时候,关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成原创 2023-11-23 18:27:05 · 535 阅读 · 0 评论 -
c++11新特性篇-可调用对象包装器, 绑定器
std::bind绑定器返回的是一个仿函数类型,得到的返回值可以直接赋值给一个std::function,在使用的时候我们并不需要关心绑定器的返回值类型,使用auto进行自动类型推导就可以了。示例程序中是使用function包装器保存了bind返回的仿函数,如果不知道包装器的模板类型如何指定,可以直接使用auto进行类型的自动推导,这样使用起来会更容易一些。在上面的程序中,使用了std::bind绑定器,在函数外部通过绑定不同的函数,控制了最后执行的结果。: 常规的函数,包括全局函数和类的成员函数。原创 2023-11-24 10:41:39 · 1707 阅读 · 0 评论 -
什么是POD类型
在现代C++中,更推荐使用这样的类型特性检查工具,而不是手动检查是否为POD类型。这些工具更准确,同时也更易读。float y;这里,将在编译时检查MyPODType是否为 trivial 和 standard layout 类型。单独使用的话, 返回值是布尔类型class A {};原创 2023-11-27 15:42:15 · 1399 阅读 · 0 评论 -
c++11新特性篇- =default 和 = delete
/ 'a' 对应的 acscii 值为97// errorb.print();第5行:禁用带 char类型参数的构造函数,防止隐式类型转换(char转int)第6行:禁止使用带char类型的自定义函数,防止隐式类型转换(char转int)第22行:对应的构造函数被禁用,因此无法使用该构造函数构造对象。原创 2023-11-28 15:18:48 · 2277 阅读 · 0 评论 -
扩展的friend语法
friend关键字在C++中是一个比较特别的存在。因为在大多数编程语言中是没有提供friend关键字的,比如Java。friend关键字用于声明类的友元,友元可以无视类中成员的属性( public、protected 或是 private )友元类或友元函数都可以访问,这就完全破坏了面向对象编程中封装性的概念。但有的时候,friend关键字确实会让程序猿少写很多代码,因此 friend 还是在很多程序中被使用到。友元提供了一种机制,允许某个类或函数在需要时访问另一个类的私有部分。原创 2023-11-29 16:46:43 · 922 阅读 · 0 评论 -
枚举和枚举类
错误的原因上面也提到了,在这两个具名的枚举中Dongjing是全局可见的,所有编译器就会提示其重定义了。另外,由于C中枚举被设计为常量数值的”别名”的本性,所以枚举的成员总是可以被隐式地转换为整型,但是很多时候我们并不想这样。原创 2023-11-30 11:05:48 · 980 阅读 · 0 评论