C++11教程:C++11新特性大汇总
文章平均质量分 77
睿科知识云
中国航天科工信息系统项目管理高级工程师
取得法律职业资格证书
希望和大家一起学习一起进步
展开
-
C++11 shared_ptr智能指针(超级详细)
C++11 shared_ptr智能指针(超级详细)在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。针对以上这些情况,很多程序员认为 C++ 语言原创 2022-02-17 12:00:49 · 540 阅读 · 0 评论 -
C++11引用限定符的用法
C++11引用限定符的用法默认情况下,对于类中用 public 修饰的成员函数,既可以被左值对象调用,也可以被右值对象调用。举个例子:#include <iostream>using namespace std;class demo {public: demo(int num):num(num){} int get_num(){ return this->num; }private: int num;};int main()原创 2022-02-17 11:54:28 · 312 阅读 · 0 评论 -
C++11 move()函数:将左值强制转换为右值
C++11 move()函数:将左值强制转换为右值C++11 标准中借助右值引用可以为指定类添加移动构造函数,这样当使用该类的右值对象(可以理解为临时对象)初始化同类对象时,编译器会优先选择移动构造函数。注意,移动构造函数的调用时机是:用同类的右值对象初始化新对象。那么,用当前类的左值对象(有名称,能获取其存储地址的实例对象)初始化同类对象时,是否就无法调用移动构造函数了呢?当然不是,C++11 标准中已经给出了解决方案,即调用 move() 函数。move 本意为 “移动”,但该函数并不能移动任何数原创 2022-02-16 12:37:10 · 589 阅读 · 0 评论 -
C++11右值引用(一看即懂)
C++11右值引用(一看即懂)前一节中提到,在 C++98/03 标准的基础上,C++11 标准对 C++ 语言增添了约 140 个新特性。本节要讲的右值引用就是众多新特性中的一个,同时也是最重要的特性之一。很多初学者都感觉右值引用晦涩难懂,其实不然。右值引用只不过是一种新的 C++ 语法,真正理解起来有难度的是基于右值引用引申出的 2 种 C++ 编程技巧,分别为移动语义和完美转发。本节先给读者讲解什么是右值引用以及它的基本用法,至于移动语义和完美转发则放到后续章节讲解。C++左值和右值右值引用可原创 2022-02-16 12:34:42 · 575 阅读 · 1 评论 -
C++11 long long超长整形详解
C++11 long long超长整形详解C++ 11 标准中,基于整数大小的考虑,共提供了如表 1 所示的这些数据类型。与此同时,标准中还明确限定了各个数据类型最少占用的位数。表 1 C++11标准中所有的整形数据类型整数类型等价类型C++11标准规定占用最少位数shortshort int(有符号短整型)至少 16 位(2 个字节)signed shortshort int(有符号短整型)至少 16 位(2 个字节)signed short intsho原创 2022-02-16 12:28:07 · 8508 阅读 · 0 评论 -
C++11 constexpr:验证是否为常量表达式
C++11 constexpr:验证是否为常量表达式(长篇神文)constexpr 是 C++ 11 标准新引入的关键字,不过在讲解其具体用法和功能之前,读者需要先搞清楚 C++ 常量表达式的含义。所谓常量表达式,指的就是由多个(≥1)常量组成的表达式。换句话说,如果表达式中的成员都是常量,那么该表达式就是一个常量表达式。这也意味着,常量表达式一旦确定,其值将无法修改。实际开发中,我们经常会用到常量表达式。以定义数组为例,数组的长度就必须是一个常量表达式:// 1)int url[10];//正确原创 2022-02-16 12:17:30 · 422 阅读 · 0 评论 -
C++11 for循环(基于范围的循环)详解
C++11 for循环(基于范围的循环)详解C++ 11标准之前(C++ 98/03 标准),如果要用 for 循环语句遍历一个数组或者容器,只能套用如下结构:for(表达式 1; 表达式 2; 表达式 3){ //循环体}例如,下面程序演示了用上述结构遍历数组和容器的具体实现过程(实例一):#include <iostream>#include <vector>#include <string.h>using namespace std;in原创 2022-02-16 12:13:27 · 404 阅读 · 0 评论 -
C++11非受限联合体(union)
C++11非受限联合体(union)在 C/C++ 中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的 C++ 为了和C语言保持兼容,对联合体的数据成员的类型进行了很大程度的限制,这些限制在今天看来并没有必要,因此 C++11 取消了这些限制。C++11 标准规定,任何非引用类型都可以成为联合体的数据成员,这种联合体也被称为非受限联合体。例如:class Student{public: Student(bool原创 2022-02-16 12:09:52 · 697 阅读 · 1 评论 -
C++11 lambda匿名函数用法详解
C++11 lambda匿名函数用法详解lambda 源自希腊字母表中第 11 位的 λ,在计算机科学领域,它则是被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式。继 Python、Java、C#、PHP 等众多高级编程语言都支持 lambda 匿名函数后,C++11 标准终于引入了 lambda,本节将带领大家系统地学习 lambda 表达式的具体用法。lambda匿名函数的定义定义一个 lambda 匿名函数很简单,可以原创 2022-02-16 12:07:08 · 315 阅读 · 0 评论 -
C++11列表初始化(统一了初始化方式)
C++11列表初始化(统一了初始化方式)我们知道,在 C++98/03 中的对象初始化方法有很多种,请看下面的代码://初始化列表int i_arr[3] = { 1, 2, 3 }; //普通数组struct A{ int x; struct B { int i; int j; } b;} a = { 1, { 2, 3 } }; //POD类型//拷贝初始化(copy-initialization)int i = 0;原创 2022-02-16 12:03:01 · 323 阅读 · 0 评论 -
C++11 tuple元组详解
C++11 tuple元组详解C++11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用 tuple;当函数需要返回多个数据时,可以将这些数据存储在 tuple 中,函数只需返回一个 tuple 对象即可。本节,我们将给大家详细地讲解 tuple 的用法。tuple对象的创建tuple 本质是一个以可变模板参数定义的类模板,它定义在原创 2022-02-16 12:00:01 · 544 阅读 · 0 评论 -
C++11支持函数模板的默认模板参数
C++11支持函数模板的默认模板参数在 C++98/03 标准中,类模板可以有默认的模板参数,如下:template <typename T, typename U = int, U N = 0>struct Foo{ // ...};但是却不支持函数的默认模板参数:template <typename T = int> // error in C++98/03: default template argumentsvoid func(){ //原创 2022-02-16 11:52:09 · 392 阅读 · 0 评论 -
C++11使用using定义别名(替代typedef)
C++11使用using定义别名(替代typedef)大家都知道,在 C++ 中可以通过 typedef 重定义一个类型:typedef unsigned int uint_t;被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。因此,下面这样将不是合法的函数重载:void func(unsigned int);void func(uint_t); // error: redefinition使用 typedef 重定义类型是很方便的,但它也有一些限制,比如,无法重定义一原创 2022-02-15 12:25:43 · 1236 阅读 · 0 评论 -
C++返回值类型后置(跟踪返回值类型)
C++返回值类型后置(跟踪返回值类型)在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景:template <typename R, typename T, typename U>R add(T t, U u){ return t+u;}int a = 1; float b = 2.0;auto c = add<decltype(a + b)>(a, b);我们并不关心 a+b 的类型是什么,因此,只需要通过 decltype(a+b)原创 2022-02-15 12:23:25 · 348 阅读 · 0 评论 -
C++ decltype类型推导完全攻略
C++ decltype类型推导完全攻略decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导。decltype 是“declare type”的缩写,译为“声明类型”。既然已经有了 auto 关键字,为什么还需要 decltype 关键字呢?因为 auto 并不适用于所有的自动类型推导场景,在某些特殊情况下 auto 用起来非常不方便,甚至压根无法使用,所以 decltype 关键字也被引入到 C++11 中。auto 和 decltype原创 2022-02-15 12:21:50 · 280 阅读 · 0 评论 -
C++ auto类型推导完全攻略
C++ auto类型推导完全攻略在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int、char 等;但是在一些比较灵活的语言中,比如 C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体的类型,而是让编译器(或者解释器)自己去推导,这就让代码的编写更加方便。C++11 为了顺应这种趋势也开始支持自动类型推导了!C++11 使用 auto 关键字来支持自动类型推导。auto 类型推导的语法和规则在之前的原创 2022-02-15 12:17:31 · 242 阅读 · 0 评论 -
C++ 11是什么,C++ 11标准的由来
C++ 11是什么,C++ 11标准的由来C++ 这门编程语言的历史可以追溯至 1979 年,当时的 Bjarne Stroustrup(C++ 之父,后续简称 Stroustrup)还在使用 Simula 语言进行开发工作。图 1 C++之父,Bjarne StroustrupSimula 语言被认为是第一个面向对象的编程语言。Stroustrup 也非常赞赏 Simula 语言的这种特性,但由于实例开发中 Simula 语言的执行效率太低,所以此后不久,Stroustrup 开始从事“带类的C”原创 2022-02-15 12:10:23 · 1018 阅读 · 0 评论