C++11简介(1)

原文地址:http://www.codeproject.com/Articles/312029/Cplusplus-A-Glance-part-of-n

1、介绍

C++0x现在是一个正式标准了,被称作C++11。ISO C++在2011年正式通过这个标准。这篇文章的目的是浏览C++11的特性和介绍VS2010中支持的特性,且可以作为你研究个别特性的一个开端。

因为长度原因,文章被分为了几部分。我自己也十分害怕一次性阅读那么长的文档,再说一次把C++11特性写完将会是工作变得无聊。

这是我在codeproject的第一篇文章,如果有格式或其他错误请包涵。

2、背景

在Charles Babbage发明了差分机后,过了近一个世纪才进入电子计算机时代。在1940s,由于电子计算机处理能力和内存的限制,只有汇编语言。在过了十多年后,1950到1970之间,时代见证了许多编程语言的兴起,其中有些至今还被使用。

在1979年,Bjarne Stroustrup在贝尔实验室工作,他的工作时加强C语言,首先增加了类,然后增加了虚函数、运算符重载、多继承、模板异常处理。他把加强的C言语叫做“带类的C语言”。1983年被改名为C++(++可能就是指继承自C语言)。

C++的里程碑

1983-第一个商业化的C++编译器

1998-C++标准化委员会标准化了C++[C++98]

2003-发布了一个补丁包,无新特性[C++03]

2005-一个技术报告“库技术报告”(简称TR1)公布。

2011-引进了许多重要的特性,并且增强了C++标准库

从上面可以看出,这次迭代是有史以来最更改最大的(是的,STL或许增加很多)。

我们需要了解这个新标准吗??

当然要。越快越好。抵抗变化时我们人类的天性。当我们掌握的语言或项目不再变化处于静态时,我们开发者离失业也就不远了。我们喜欢动态变化的项目,对于编程语言也一样。变化时不可避免的,专家委员会经过近十年的头脑风暴的成果显然十分有意义。

及时我们对这次在代码迭代中的更新不感兴趣,快速浏览一下这些特性也会帮助我们避免在编码之前使用旧的编译器。再说,只是简单把编译器换成支持C++11特性的,我们即可享受到C++11带来的好处,因为他的标准库增强了,性能更好了。所以如果你的项目用STL容器或算法,尽快更换编译器。

C++11特性

下面这个表总结了C++11的特性以及VS2010是否支持这些特

C++11的特性以及VS2010是否支持这些特
特性            目的           vs2010支持?
auto 可用性增强 支持
decltype 可用性增强 支持
Trailing return types 可用性和性能增强 支持
Right angle brackets 可用性增强 支持
static_assert 可用性增强 支持
nullptr 可用性和性能增强 支持
Strongly typed enums 类型安全增强 部分支持
Rvalue references 性能增强 支持
Move semantics 性能增强 支持
long long 性能增强 支持
Override control 可用性增强 支持
Lambda expressions 可用性和性能增强 支持
preventing narrowing 性能增强 不支持
Range based for-loops 可用性和性能增强 不支持
STL增强
array 支持                           
Really smart pointers [unique_ptr, shared_ptr, weak_ptr] 支持
bind and function 支持
tuple 支持
unoredered_map,unordered_set 支持
forward_list 支持
……  

C++11特性

auto 关键字

这个特性使C++更加易用。委员会赋予了auto新的含义(提醒读者,旧的auto关键修饰的变量是说明这个变量作用域限于局部,除非有关键字static、extern、static修饰,现在auto隐式转换为自动存储)

新的标准中,auto可以根据初始化的值或初始化表达式来推论其修饰变量的类型。

auto i=5;//i将会定义为int类型

int n=3;
double pi=3.14;
auto j=pi*n;//j将会是double类型

现在来看一个变量类型难以写的例子

//假设有一个Map,存储 int和map(int,int)
map<int, map<int,int> > _Map;
//定义这个map的迭代器
map<int, map<int,int>>::const_iterator itr1=_Map.begin();
//如果使用auto将会变得简单
const auto itr2=_Map.begin();

现在来看一个变量类型不易知的例子

template<class U, class V>
void Somefunction(U u, V v)
{
    ??? result = u*v; // result的类型是什么呢 ??? 

    // 使用auto的话,让编译器来决定result的类型
    auto result = u*v;
}

我将用继续讲解下个特性一遍你们了解auto带来的易用性。当使用lambda表达式时,auto也十分易用(我们很快介绍lambdas)。

关于这个特性的给几个例子:

1、我们可以使用const、volatile、引用&、右值rvalue引用&&(&&-将会很快了解)修饰auto关键

auto k = 5;
auto* pK = new auto(k);
auto** ppK = new auto(&k);
const auto n = 6; 

2、auto修饰的变量必须要初始化

auto m; // m 应该初始化

3、auto不能与类型修饰符一起用

auto int p; // 不能这样用

4、函数和模板的参数不能用auto修饰

void MyFunction(auto parameter){} // 不能用auto修饰函数参数 

template<auto T> // 没意义-不允许
void Fun(T t){}

5、在堆上定义的变量,如果用auto修饰,必须初始化

int* p = new auto(0); //正确
int* pp = new auto(); // 应该初始化

auto x = new auto(); // Hmmm ... 没初始化

auto* y = new auto(9); // 正确,这里y是int*
auto z = new auto(9); //正确,这里z是int* (不是int)

6、auto是一个类型占位符,但是auto不能定义自己的类型。因此auto不能用来做类中转换或者与sizeof和typeid相关的操作

int value = 123;
auto x2 = (auto)value; // 不能用auto转换

auto x3 = static_cast<auto>(value); // 同上

7、用一个auto修饰的多个变量必须初始化为同样的类型

auto x1 = 5, x2 = 5.0, x3='r';  // 这里太多类型,不能这样用

8、除非修饰引用,auto把变量类型转换为CV修饰符(const和Volatile修饰符)

const int i = 99;
auto j = i;       // j 是int类型,而不是const int
j = 100           // 正确,j不是const

// 试一下引用
auto& k = i;      // k是const int&
k = 100;          // 错误,ks是const

// 对volatile修饰符,同理

9、除非定义引用,否则auto将把数组退化为指针

int a[9];
auto j = a;
cout<<typeid(j).name()<<endl; // 将会输出 int*

auto& k = a;
cout<<typeid(k).name()<<endl; // T将会输出 int [9

decltype类型修饰符

return_value decltype(表达式)

return_value是表达式的类型参数

这样可以用来决定表达式的类型,正如Bjarne所暗示的,如果我们只是需要一个变量的类型,使用初始化auto是个简单的选择。如果我们需要非变量的类型,例如

返回值类型,那么decltype就是我们需要的。

现在让我们看看刚才的一个例子

template<class U, class V>
void Somefunction(U u, V v)
{
   result = u*v; // result是什么类型呢

   decltype(u*v) result = u*v; // 哈哈 ....我们得到了我们想要的
}

在下一节,我将会介绍联合使用auto和decltype来声明模板函数,模板函数的返回值局定于模板的参数

使用decltype的几点建议:

1、如果表达式是一个函数,那么decltype的类型是函数的返回类型

1、如果表达式是一个函数,那么decltype的类型是函数的返回类型
int add(int i, int j) { return i+j; }

decltype( add(5,6) ) var = 5; // var的类型是add函数的返回值类型-int

2、如果表达式是左值,那么decltype

struct M { double x; };

double pi = 3.14;
const M* m = new M();
decltype( (m->x) ) piRef = pi;

    // 注意,由于内部括号,内部的声明被当做表达式
    // 而不是当做成员变量x, x类型是double,且是左值
    // declspec是double&,‘m’是const指针
    // 所以返回是const double&
    // 所以变量piRef的类型是const double&

3、有一点值得注意,decltype不像auto估算表达式,它只是推断表达式

int foo(){}
    decltype( foo() ) x; // x是int类型,在运行时不调用foo(

结尾修饰返回类型

这个是C++11的全新特性。直到现在,函数的返回值类型应在函数名前面。从C++11起,我们可以把函数返回类型放在函数声明的后面,仅仅在替换

auto修饰的返回类型。现在我们来看一下为什么这样做:

template<class U, class V>
??? Multiply(U u, V v)    // 怎么确定返回值类型
{
   return u*v;
}

我们不能这样做:

template<class U, class V>
decltype(u*v) Multiply(U u, V v)    // 因为在Multiply之前,u和v没有定义,怎么办!!
{
   return u*v;
}

在这种情况下,我们可以使用auto,一旦u和v定义知道时,我们就可以确定返回值类型。

很酷,不是吗?

template<class U, class V>
auto Multiply(U u, V v) -> decltype(u*v)    // 注意->在定义函数括号之后.
{
   return u*v;
}

右尖括号

看这个声明,

map<int, vector<int>> _Map;

在早些的编译器中这是错误的,因为在两个右尖括号之间没有空格,编译器将会把它当做右移操作符。

但是C++11编译器将会语法分析模板参数结束时的多重右尖括号,让我们免于在‘>‘输入空格。

与其他特性相比,这个不一个大的特性。但是C++开发者追求完美,这就是一个例子。

C++11简介(1)

时间: 2024-10-09 17:01:16

C++11简介(1)的相关文章

802.11 ------ 简介

IEEE 802.11是现今无线局域网通用的标准,它是由电气电子工程学会(IEEE)所定义的无线网络通信的标准,定义了媒体访问控制层(MAC层)和物理层. 总线型局域网在MAC层的标准协议是CSMA/CD,即载波侦听多路存取/冲突检测(Carrier Sense Multiple Access with Collision Detection).但由于无线产品的适配器不易检测信道是否存在冲突,因此802.11全新定义了一种新的协议,即载波侦听多路存取/冲突避免CSMA/CA(with Colli

[转帖] Oracle JDK 11 正式发布.. 版本号真快

Java 11 / JDK 11 正式发布! oschina 发布于 2018年09月26日 收藏 19 评论 38 在您的既有IT基础设施上按需构建人工智能更高效>>>   美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 Java 8 后的首个长期支持版本,非常值得大家的关注,可以通过下面的地址进行下载: https://www.oracle.com/technetwork/java/javase/downlo

使用Selenium爬取百度文库word文章

转载请注明作者和出处: http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 前言 问题分析 预备知识 1 Selenium 11 简介 12 安装 13 基础知识 131 小试牛刀 132 模拟提交 133 元素选取 134 界面交互 135 添加User-Agent 2 Xpath 动手实战 1 页面切换 2 内容爬取 3 整体代码 总结 1 前言 大家都应该有过从百度文库下载

WiFi基本知识

转自:http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11简介 标准号 IEEE 802.11b IEEE 802.11a IEEE 802.11g IEEE 802.11n 标准发布时间 1999年9月 1999年9月 2003年6月 2009年9月 工作频率范围 2.4-2.4835GHz 5.150-5.350GHz 5.475-5.725GHz 5.725-5.850GHz 2.4-2.4835GHz 2.4-2

WiFi基本知识【转】

转自:http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11简介 标准号 IEEE 802.11b IEEE 802.11a IEEE 802.11g IEEE 802.11n 标准发布时间 1999年9月 1999年9月 2003年6月 2009年9月 工作频率范围 2.4-2.4835GHz 5.150-5.350GHz 5.475-5.725GHz 5.725-5.850GHz 2.4-2.4835GHz 2.4-2

linux下svn服务器(未完,待整合myeclipse)

SVN服务器的搭建 -----基于Red Hat Enterprise Linux Server release 6.4 (Santiago) :Subversion1.6.11 简介:svn是一种版本管理系统,前身是cvs,都是开源软件.为了提高效率,多人协同开发代码,项目代码都储存在服务器上,subversion管理着随时间改变的数据,这些数据存放在中央资料库(repository)中,这个档案库很想一个普通的文件服务器, 不过他会记录每一次文件的变动,并且可以管理任何类型的文件,包括程序源

session购物车

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /**  * 函数:addGoods  * 功能:将物品放入购物车[SESSION]中  * 简介:将指定物品信息$goods存入指定名$cartName的购物车中,默认在物品信息首部附加“购物车物品序号”$skey  * 时间:2011年7月28日 23:51:40  * 作者:zhjp  * Enter description he

村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因

1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说明了电子设备中使用EMI静噪滤波器(EMIFIL®)的原因,还概述了通常电磁噪声抑制所用的典型屏蔽和滤波器的操作. 图1-1 EMI静噪滤波器 (EMIFIL®) 1-2. 什么是电磁噪声干扰? 电子设备收到强电磁波时,电路中会感应到不想要的电流,这会产生非预想的操作或对预想的操作形成干扰.如果外部

分享这几年收藏的C# PDF电子书定制制作下载

本人背靠海量纸质图书,可以制作各种纸质书籍的电子化,有需要可以Q:1481449626 <基于ASP.NET的网站建设与管理 C#>作者:陈光军,韩立军主编 页数:300 出版社:北京市:北京邮电大学出版社 出版日期:2013.05 简介:本书共分12章,列举大量实例,详细介绍了网站建设与管理的最新理念与应用技术,从网站的建设目标.总体规划开始,全面论述了网站建设与管理的基本知识.网页设计和制作的技术与技巧. <C#实用教程>作者:郑阿奇 页数:364 出版社:北京市:电子工业出版