C++11系列-什么是C++11
什么是C++0x?
C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性。在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编译器已经支持了部分C++11特性。
C++11包括大量的新特性:主要特征像lambda表达式和移动语义,实用的类型推导关键字auto,更简单的容器遍历方法,和大量使模板更容易使用的改进。这一系列教程将包含所以以上特性。
你该关注C++11吗?
很明显,C++11为C++带来了大量的新特性。C++11将修复大量缺陷和降低代码拖沓,比如lambda表达式的支持将使代码更简洁。像移动语义这种特性会提高语言内核的基础效率,使你可以写出更快的代码。对模板系统的优化可以使你更容易写出泛型的代码。
新的标准库同时也会包含新的特性,包括对多线程的支持和优化智能指针,后者将给那些还没用类似于boost::shared_ptr的人提供更简单的内存管理方法。
我已经开始使用新的C++11特性,并且非常喜欢:新的auto关键字,对模板”>>“写法的支持,lambda表达式和新的函数定义语法。
C++11是如何开发出来的?
C++11的出现,首先要感谢C++标准委员会的辛勤工作,一群来自学术界和工业界的专家,他们的多次会晤攻克难题,终于设计出了一种跨平台,被多种编译器支持,可以生成高效易维护代码的语言。而C++11新标准,就像对灵活强大的C++的一次不可思议的扩展。
C++11包括什么?
更易用的语言
使用过C++11后,我发现它提供了大量的基础方法使C++变成了一种更易使用的语言。这不是说它变成了简单的语言—这里有大量的新特性—提供了大量的方法使编程更容易。让我们看一个例子,auto关键字。在C++11中,假如编译器可以从变量的初始化中得到它的类型,那么你不必要指定类型。比如,你可以这样写:
|
编译器可以推导出y的类型是int。当然,这不是一个证明auto有用的一个闪亮的例子。当使用模板特别是STL时auto很好用。为什么这么说,想象使用一个迭代器(iterator):
|
现在你想遍历address_book中的元素,要这样做,你需要一个迭代器:
|
这是一个恐怖的长类型声明,当你已经知道这个类型的时候。这样是不是简洁多了:
|
代码变得更简单明了,我觉得可读性也更高了,因为模板语法使这一行其它内容变模糊了。这是我特别喜欢的一个特性,我发现它消除了许多头疼和难以追踪的编译错误,节省了时间而没有丢掉表达式的意思。
区间迭代(range-based for loop)
下面迭代器的例子是C++11提供的一种处理迭代的更好方法,有些人叫做区间迭代(基本上所有的现代语言都支持)。这个例子足够证明这种语法是多么优雅:
|
你需要做的就是给出一个变量和要迭代的区间。但是如果你想迭代一个map怎么办?你怎么设置map中值的类型?你知道vector值的类型是int。但map的值类型是pair,通过.first和.second给你提供键和值。但是用auto,你根本无需关心确切类型,你可以简单的写成:
|
这将打印出:
|
这是一个不错的C++11新特性组合用法吧?
>>(right angle brackets)
我这里还有更易用的优化—在以前的C++标准中,假如你写一个含有其他模板类型的模板:
|
你必须在结束的两个’>‘之间添加空格。这不仅烦人,而且当你写成>>而没有空格时,你将得到困惑和误导的编译错误信息。产生这种行为的原因是C++词法分析的最大匹配原则(maximal munch rule)。一个好消息是从今往后,你再也不用担心了:
|
对,这确实是个小东西,不过却是人工代码克服机器工具的胜利。另外,这样写就不那么丑了。
多线程
这是第一次,C++11将包含一种内存模型和对应的多线程库,这意味着你将可以编写符合标准的多线程代码。新标准将提供所有的通用线程方法,比如线程、线程局部存储和原子操作。它也提供了一系列有趣的特性:futures和promises。futures和promises的主要思想是,你可以编写代码表示,“这个对象,一个future代码还没计算完的结果”,它将可以在后台计算结果。当这个值需要的时候,你向future发请求,假如这个值准备好了,那就可以得到它,要不然继续等待。
我将在后续的文章中深入探讨多线程。
还有好多其他的东西
C++11特性的数量是客观的。你可以阅读维基百科里的C++11页面,而我计划在这一系列文章中深入探索这些特性,包括:
- 如何用auto、decltype和新的函数语法编写更好的代码
- Lambda表达式
- 区间迭代
- 常量表达式
- 右值引用和移动语义
- nullptr和强类型的枚举
C++11的编译器支持
当然,如果无法使用再好的语言特性又有什么用,好消息是大量的编译器已经开始支持C++11。Apache基金会整理了一个列表,列出了C++11的语言特性和编译器的支持情况:支持C++11的编译器。假如你对GCC感兴趣,这里有GCC4.7支持C++11。
有些编译器,比如GCC,不会默认支持这些新特性—例如,为了支持C++11特性,编译时必须指定 -std=c++0x。当然这也是很有用的,你可以在你的项目中选择编译器和语言集。
from:http://towriting.com/blog/2013/08/01/what-is-cpp11/
C++11系列-什么是C++11的更多相关文章
- C++11 并发指南一(C++11 多线程初探)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- C++11 并发指南一(C++11 多线程初探)(转)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- 【C/C++开发】C++11 并发指南一(C++11 多线程初探)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- GTAC 2015将于11月10号和11号召开
今年的GTAC注册已经结束,将会在11月10号和11号在Google马萨诸塞州剑桥办公室召开.大家可以关注https://developers.google.com/google-test-autom ...
- int和integer;Math.round(11.5)和Math.round(-11.5)
int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...
- 本周MySQL官方verified/open的bug列表(11月15日至11月21日)
本周MySQL verified的bug列表(11月15日至11月21日) 1. Bug #70923 Replication failure on multi-statement INSERT ...
- 本周MySQL官方verified/open的bug列表(11月8日至11月14日)
本周MySQL verified的bug列表(11月8日至11月14日) 1. Bug #70859-DWITH_EXAMPLE_STORAGE_ENGINE=1 is ignored URL ...
- 本周MySQL官方verified的bug列表(11月1日至11月7日)
本周MySQL verified的bug列表(11月1日至11月7日) 1.Bug #70839JSON_VALID allows to have two elements with the same ...
- 转如何升级oracle版本?(11.2.0.1至11.2.0.4)
dbua from 11.2,0.2 to 11.2.0.4 need 2hours 升级结果: 步骤名 日志文件名 状态 升级前操作 PreUpgrade.l ...
随机推荐
- vue组件---插槽
(1)插槽内容 Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 <slot> 元素作为承载分发内容的出口. 在父级组件里可以 ...
- 后台中的sql注入
aa.getSqlMap().put("order"," and a.id not in(\'"+po.getId()+"\')"); \' ...
- 解决idea控制台打印乱码问题
idea控制台打印乱码,用起来总别扭,也是在网上搜索了一番,靠一点猜测解决了. 首先打开你自己的idea的安装目录下(即右键桌面图标,点击打开文件所在位置),然后找到idea.exe.vmoption ...
- Linux:DNS主、从、缓存服务器配置、DNS同步加密TSIG配置、DNS分离解析配置
DNS主服务器配置(正向解析.反向解析) 正向解析:根据主机名查找对应的IP地址.当用户访问一个域名时(不考虑hosts文件等因素),正常情况会向指定的DNS主机发送递归查询请求反向解析:根据IP地址 ...
- PKI相关知识简述
1. 公钥泄露导致中间人攻击 有A.B.C三个人,如果C把自己的公钥提供给了AB双方,C伪装成B,让A认为C就B,这样A就把自己的公钥发送给C,C再伪装成A,让B认为C就A,B就把自己的公钥也发送给了 ...
- 51nod1485 字母排序
[题解] 开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可.同时也有平衡树做 #include<cstdio> #include<algorith ...
- 手写DAO框架(三)-数据库连接
-------前篇:手写DAO框架(二)-开发前的最后准备--------- 前言 上一篇主要是温习了一下基础知识,然后将整个项目按照模块进行了划分.因为是个人项目,一个人开发,本人采用了自底向上的开 ...
- node.js 核心http模块,起一个服务器,返回一个页面
let http=require("http"); //引入核心http模块 let fs=require("fs"); let mime={ '.js':'a ...
- [USACO07OCT]障碍路线Obstacle Course
题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...
- 【触发器】MySQL触发器使用详解
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器在MySQL中,创建触发器语法如下: ...