掀起C++ 11的神秘面纱(转载自51CTO)
来源:互联网 发布:美发店收银软件下载 编辑:程序博客网 时间:2024/06/03 03:57
掀起C++ 11的神秘面纱
C++之父Bjame Stroustrup最近说C++11就像一个新语言,的确,C++11核心已经发生了巨大的变化,它现在支持Lambda表达式,对象类型自动推断,统一的初始化语法,委托构造函数,deleted和defaulted函数声明nullptr,以及最重要的右值引用。
AD:WOT2015 互联网运维与开发者大会 热销抢票
【51CTO 6月21日外电头条】C++之父Bjame Stroustrup最近说C++11就像一个新语言,的确,C++11核心已经发生了巨大的变化,它现在支持Lambda表达式,对象类型自动推断,统一的初始化语法,委托构造函数,deleted和defaulted函数声明nullptr,以及最重要的右值引用。
【编辑推荐】
C++0x FAQ中文版(http://imcc.blogbus.com/logs/106046323.html)
C++11标准库也使用新的算法,新的容器类,原子操作,类型特征,正则表达式,新的智能指针,async()函数和多线程库进行了改造。
C++11的新内核和库特性完整列表请移步这里(http://www2.research.att.com/~bs/C++0xFAQ.html)。 C++标准在1998年获得通过后,有两位委员会委员预言,下一代C++标准将“肯定”包括内置的垃圾回收器(GC),但可能不会支持多线程,因为定义一个可移植的线程模型涉及到的技术太复杂了,13年后,新的C++标准C++11也接近完成,你猜怎么着?让那两位委员没想到的是,本次更新还是没有包括GC,但却包括了一个先进的线程库。
在这篇文章中,我将介绍C++11标准中发生的最大变化,以及为什么应该引起注意,正如你将看到的,线程库不是唯一的变化,新标准采纳了数十位专家的意见,使C++变得更有意义。正如Rogers Cadenhead指出的那样,它们就像迪斯科、宠物石和长胸毛的奥运游泳选手一样不可思议。
首先,让我们看看C++11核心语言的一些突出特性。
Lambda表达式
Lambda表达式允许你在本地定义函数,即在调用的地方定义,从而消除函数对象产生的许多安全风险,Lambda表达式的格式如下:
- [capture](parameters)->return-type {body}
[]里是函数调用的参数列表,表示一个Lambda表达式的开始,让我们来看一个Lambda例子:
假设你想计算某个字符串包含多少个大写字母,使用for_each()遍历一个char数组,下面的Lambda表达式确定每个字母是否是大写字母,每当它发现一个大写字母,Lambda表达式给Uppercase加1,Uppercase是定义在Lambda表达式外的一个变量:
- int main()
- {
- char s[]="Hello World!";
- int Uppercase = 0; //modified by the lambda
- for_each(s, s+sizeof(s), [&Uppercase] (char c) {
- if (isupper(c))
- Uppercase++;
- });
- cout<< Uppercase<<" uppercase letters in: "<< s<<endl;
- }
这是因为,如果你定义的函数主体被放置在另一个函数调用内部,[&Uppercase]中的“&”记号意味着Lambda主体获得一个Uppercase的引用,以便它能修改,如果没有这个特殊记号,Uppercase将通过值传递,C++11 Lambda表达式也包括成员函数构造器。
自动类型推断和decltype
在C++03中,在声明对象时,你必须指定对象的类型,然而,在许多情况下,对象的声明包括在初始化代码中,C++11利用了这个优势,允许你声明对象时不指定类型:
- auto x=0; //x has type int because 0 is int
- auto c='a'; //char
- auto d=0.5; //double
- auto national_debt=14400000000000LL;//long long
相反,你可以声明下面这样的迭代器:
- void fucn(const vector<int> &vi)
- {
- vector<int>::const_iterator ci=vi.begin();
- }
关键字auto不是什么新生事物,我们早已认识,它实际上可以追溯到前ANSI C时代,但是,C++11改变了它的含义,auto不再指定自动存储类型对象,相反,它声明的对象类型是根据初始化代码推断而来的,C++11删除了auto关键字的旧有含义以避免混淆,C++11提供了一个类似的机制捕捉对象或表达式的类型,新的操作符decltype需要一个表达式,并返回它的类型。
- const vector<int> vi;
- typedef decltype (vi.begin()) CIT;
- CIT another_const_iterator;
未全部转载,全文在http://developer.51cto.com/art/201106/270597_all.htm
原文名:The Biggest Changes in C++11
- 掀起C++ 11的神秘面纱(转载自51CTO)
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱(1)
- 掀起C++ 11的神秘面纱(2)
- 掀起C++ 11的神秘面纱(3)
- 掀起C++ 11的神秘面纱
- 掀起硬盘主引导扇区的神秘面纱
- 掀起“红盖头”:揭开真正意义的DSP神秘面纱
- 掀起斯柯达速派2.0TSI的神秘面纱
- 掀起“红盖头”:揭开真正意义的DSP神秘面纱
- 转载: 代码可维护性的神秘面纱
- C#文件路径操作总结 转载自 51cto 周金桥
- 揭开正则表达式的神秘面纱(转自:http://www.regexlab.com/zh/regref.htm)
- Oracle揭开11g的神秘面纱
- 揭开木马的神秘面纱(二)
- 开发模式下,extjs中使用scss,并及时更新
- HDU 1540 POJ 2892 线段树区间合并
- shell脚本里面通过正则匹配操作字符串的问题
- Android WebView 开发详解(二)
- Linux下获取所有可用网卡信息
- 掀起C++ 11的神秘面纱(转载自51CTO)
- SecureCRT上传、下载及常用命令
- 1002. A+B for Polynomials (25)
- android studio 更新 Gradle错误解决方法
- git push error:error: insufficient permission for adding an object to repository data
- java super和this的区别
- IOS APP 上传APP store
- iOS—打电话、发短信
- [android开发]对象的持久化操作 (写入对象到本地文件, 从本地文件中读取对象)