C++第11版本中的一些强大的新特性小结

Auto Type Deduction 自动类型推导

auto 关键字让用户得以使用 C++ 内置的类型推导特性。

std::string something = somethingthatreturnsastring.getString();
auto something = somethingthatreturnsastring.getString();

Auto 关键字会对上述自变量(something)进行自动推导,得出其应该是 string 类型的结论,并在 auto 出现的地方用正确的类型进行替换。这个特性对迭代器特别有用。

for(std::vector<T>::iterator it = x.begin(); it != x.end(); i++)
{
  it->something();
}

上述代码可以写成:

for(auto it = x.begin(); it != x.end(); i++)
{
  it->something();
}

赞! 代码看上去简洁多了!

Strongly Typed Enums 强类型枚举

这个特性可以有效避免枚举类型的命名冲突,从而消除很多潜在的 bug。在旧版本的 C++ 中,程序员必须为每一个枚举项设定一个全局唯一的名字。例如,如果你给一个枚举项取名叫 None,那么其他的枚举集合就不能再用这个名字了。但是现在,你可以这么做了!(译注:作者下面给的例子仿佛和上面的文字不是非常搭配//myEnum ::All 和 myEnum::All是不是存在差异?)

enum class myEnum {None, One, All};
myEnum o = myEnum ::All;
auto p = myEnum::All;
// 同样有效

Lambdas 表达式

Lambda 表达式简单说就是个匿名函数(译注:原文为in-place function,意思是“用来镶嵌的函数”,但是匿名函数能更精确表达这个含义)。对于迭代器以及for 循环非常有用,这种函数你只需要在程序的某一处使用一次,所以没有必要专门在程序里明确定义它。Lambda 表达式并没有让 C++ 在逻辑表达上做到“及以往之不可及”的程度,它是一种受函数式编程思想影响而引入的语言特性,能够让程序更紧凑。Lambda 表达式的最简形式是下面这样的:

[]() { }

加上所有可能的操作符,会是这样:

[]() mutable -> T { }
其中[]是捕获列表,()是参数列表,{}是函数体

Capture List 捕获列表

捕获列表定义了什么类型的东西可以从 Lambda 表达式之外匹配到函数体中来。可以包含以下这些:

一个值:[x]
一个引用 [&x]
当前范围内任意变量的引用 [&]
同3,但是通过变量的值
你可以对上面的各项进行任意混合,只要用逗号隔开即可 [x, &y]

Argument List 参数列表

参数列表和 C++ 函数的参数列表是一个概念。

Function Body 函数体

函数体是指在 Lambda 表达式被调用时真正执行的代码。

Return Type Deduction

返回值推断

如果 Lambda 表达式只有一个返回声明,那么返回值类型就可以省略,其类型就是隐式类型:decltype(return_statement)

可变 Labmda

如果一个 Lambda 表达式被标记为 mutable(例如:[]() mutable{ }),那么对于按值捕获的数值来说,在函数体内就允许对这些值进行修改操作。

下面举个例子:

int main()
{
  char s[]="Hello World!";
  int Uppercase = 0;
//lambda会改变这个变量的值
  for_each(s, s+sizeof(s), [&Uppercase] (char c) {
  if (isupper(c))
   Uppercase++;
  });
 cout<< Uppercase<<" uppercase letters in: "<< s<<endl;
}

Unique 指针

Unique 指针是 C++11 版本的智能指针类。

一旦你用 unique_ptr 关键字定义了一个对象,那么下列事件只要发生一个,对象就会被销毁并释放内存:

unique_ptr 管理的对象被销毁。
unique_ptr 管理的对象通过赋值操作符指向另一个指针,或调用了reset()方法。
对于不想了解太多细节的用户来说,这就意味着如果你使用了 unique 指针的语义,那么在跳出作用域之前,你就不用手动回收对象的内存了。

以前,我们需要这么写代码:

YourObject * obj = new YourObject();

然后在程序的最后你一定要记得释放内存:

delete(obj);
否则你可就造成内存泄露了。而现在,

std::unique_ptr<YourObject> obj(new YourObject());

当 obj 跳出作用域范围之外的时候,内存将会被自动回收。

static_assert

static_assert 简单说就是一个在编译期执行的断言。例如,你可以这么做:

static_assert(sizeof(unsigned int) * CHAR_BIT == 32);

假设由于系统的原因造成了上述的逻辑判断的失败,那么 static_assert 就会断言失败。

它的另一种用途,是和 C++ 特征类型搭配使用。比如:

static_assert(std::is_pod<yourstruct>::value, "Not a pod struct!");

POD 是指“简单数据”(Plain Old Data)结构,也就是说,它是一个的类(你可以用struct关键字定义,也可以用class关键字定义),但没有构造函数,析构函数和虚成员函数。所以,如果一个愚蠢的菜鸟程序员企图给这种类型增加构造函数的话,static_assert 就会在编译的时候阻止这种行为,并报错。这对代码维护来说可是非常有用的。

(0)

相关推荐

  • 结合C++11新特性来学习C++中lambda表达式的用法

    在 C++ 11 中,lambda 表达式(通常称为 "lambda")是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象的简便方法. Lambda 通常用于封装传递给算法或异步方法的少量代码行. 本文定义了 lambda 是什么,将 lambda 与其他编程技术进行比较,描述其优点,并提供一个基本示例. Lambda 表达式的各部分 ISO C++ 标准展示了作为第三个参数传递给 std::sort() 函数的简单 lambda: #include <algorit

  • C++11的新特性简单汇总介绍 (二)

    1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; for(int x: vec) { cout<<x<<endl; } 2. 尾置返回类型 要想引入尾置类型,我们还得从复杂的类型声明说起.如果我们需要定义一个含有10个int元素的数组,一般是这样的: int arr[10] = {0}; 如果要定义指向这个数组的指针呢: 复制代码 代

  • C++11的新特性简单汇总介绍 (一)

    什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. 1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己

  • 结合C++11的新特性来解析C++中的枚举与联合

    枚举 枚举是用户定义的类型,其中包含一组称为枚举器的命名的整型常数. 语法 // unscoped enum: enum [identifier] [: type] {enum-list}; // scoped enum: enum [class|struct] [identifier] [: type] {enum-list}; // Forward declaration of enumerations (C++11): enum A : int; // non-scoped enum mu

  • c++11新增的便利算法实例分析

    C++是一门应用非常广泛的程序设计语言,而c++11则新增加了一些便利的算法,这些新增的算法使我们的代码写起来更简洁方便,本文列举一些常用的新增算法,算是做个总结分析,更多的新增算法读者可以参考:http://en.cppreference.com/w/cpp/algorithm. 算法库新增了三个用于判断的算法all_of.any_of和none_of,定义如下: template< class InputIt, class UnaryPredicate > bool all_of( Inp

  • C++ 11实现检查是否存在特定的成员函数

    问题提出 最近工作中遇到这样一个需求:实现一个ToString函数将类型T转换到字符串,如果类型T中含有同名方法ToString则直接调用. 这样一个ToString实现可以使用std::enable_if来做到,但是这里的难点在于如何判断类型T中存在这样一个ToString方法,以便可以放入enable_if中做SFINAE. 检查类中是否存在特定成员 相同的问题在知乎上有人提出过,@孙明琦的答案提供了一个用于检测特定检测子U在类型T下是否有效的检测器is_detected_v.其中用到了一个

  • C++第11版本中的一些强大的新特性小结

    Auto Type Deduction 自动类型推导 auto 关键字让用户得以使用 C++ 内置的类型推导特性. std::string something = somethingthatreturnsastring.getString(); auto something = somethingthatreturnsastring.getString(); Auto 关键字会对上述自变量(something)进行自动推导,得出其应该是 string 类型的结论,并在 auto 出现的地方用正确

  • C++ 11和C++98相比有哪些新特性

    C++11标准提供了许多有用的新特性.这篇文章特别针对使C++11和C++98相比看上去像一门新语言的特性,因为: C++11改变了书写C++代码的风格和习惯,也改变了设计C++库的方式.例如,你会看到更多的被当作参数和返回值的智能指针,还有按值(by value)返回巨大对象的函数. 它们被使用的非常广泛,在大多数代码中你都能看到它们.举个例子,在现代C++中几乎每5行C++代码你就能看到auto关键字. 还有一些其它的非常好的C++11新特性,但先把这篇文章所描述的新特性熟悉起来把,因为这些

  • Python 3.10 中 6 个兴奋的新特性

    新的 Python 版本推出了有趣的新功能. Python 是当今最流行的编程语言之一.它有广泛的领域和应用,从学习计算机科学的基础,到执行复杂或者直接的科学计算任务来创建游戏.它的高级应用甚至包含数据科学和量子计算. Python的流行有很多原因.其中最主要的原因是Python和其他语言相比,通用性强,简单易学.除此之外,Python的开发和维护者--Python软件基金会--一直致力于用新的方法改进Python. 一周之前(2021年10月4日),一个新的Python版本发布了,Python

  • C#6.0中你可能不知道的新特性总结

    为什么写? 今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,整体看下来是一脸懵逼的. 下班回到家里,打开这个视频,把视频中介绍的新特性用文档的形式记录下来,加深自己的印象,此处把我整理的文档分享出来,希望对大家能有所帮助! C#6.0已经发布快三年了,可能我们没有有太去关心新版本所加入的特性,有人说,发布新版本,无非就是添加一些"语法糖"罢了,不管是糖不是糖,既然加入了新功能,那么自然有新功能的好处,我们

  • ES6中let 和 const 的新特性

    在javascript中,我们都知道使用var来声明变量.javascript是函数级作用域,函数内可以访问函数外的变量,函数外不能访问函数内的变量.本文给大家介绍ES6中let 和 const 的特性,具体内容如下所示: let的特性: 1.不存在变量提升现象:即声明前使用,报ReferenceError.适用于for循环计数器. 2.暂时性死区:即在块级作用域内使用let声明变量,该变量只能在该作用域内使用. 3.不允许重复声明:let声明过的变量不能再次声明,否则报错. const的特性:

  • Django 2.0版本的新特性抢先看!

    前言 2017年12月2日,Django官方发布了2.0版本,成为多年来的第一次大版本提升,那么2.0对广大Django使用者有哪些变化和需要注意的地方呢? 一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django 1.11.x是支持Python2.7的最后版本. 二.2.0新特性 1.简化了URL路由语法 django.urls.path()方法的语法更

  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本.非常值得大家的关注,可以通过下面的地址进行下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年. 现在大部

  • C++11新特性“=default”,“=delete”的使用

    1. =default 和=delete 概述 任何事物的出现都必然有着其出现的理由,伴随着每一个新的概念产生都会带来一系列的便利和价值.C++在不断的演变与发展,与此同时,伴随着许多新的特性和功能产生.=default.=delete 是C++11的新特性,分别为:显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器不生成函数默认的缺省版本).C++11中引进这两种新特性的目的是为了增强对"类默认函数的控制",从而让程序员更加精准地去控制默认版本的函数.其具体的功能和使

  • Laravel6.2中用于用户登录的新密码确认流程详解

    Laravel 昨天发布了 v6.2 版本,它添加了一个新的密码确认功能,该功能使你可以要求已登录的用户重新输入密码,然后才能访问路由. 在你执行敏感操作的时候,这个功能就类似 GitHub 确认对话框.在 Laravel 中你可以轻松的设置它,所以让我们来试用一下新功能,以便你可以更好的了解它的工作原理: 设置 首先,为了更直观的了解这个新功能,我们创建一个新的 Laravel 应用: laravel new confirm-app cd confirm-app composer requir

  • PHP4(windows版本)中的COM函数

    PHP4(windows版本)中的COM函数 这几天一直在写excel转化成mysql,发现一篇文章,搜一下phpx论坛,没有这个帖子,把它转帖如下: PHP4(windows版本)中的COM函数 介绍 内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档.本文将以三个例子分 别处理 MS office 2000 Word . Excel . Adobe Distiller 来说明如何在PHP中使用COM函数. COM技术是由Micro

随机推荐