【6月21日外电】C++之父BjameStroustrup近日表示,C++11就像一门新语言。事实上,C++11的核心已经发生了巨大的变化。它现在支持Lambda表达式、对象类型的自动推断、统一初始化语法、委托构造函数、已删除和默认的函数声明nullptr,以及最重要的右值引用。【编辑推荐】C++0xFAQ中文版(http://imcc.blogbus.com/logs/106046323.html)C++11标准库还使用了新算法、新容器类、原子操作、类型特性、正则表达式、新的智能指针、async()函数和多线程库都进行了改进。如需C++11中新内核和库功能的完整列表,请访问此处(http://www2.research.att.com/~bs/C++0xFAQ.html)。1998年C++标准通过后,两名委员会成员预测,下一代C++标准“肯定”会包含内置垃圾收集器(GC),但可能不支持多线程,因为定义了一种可移植的线程模型技术涉及的太复杂了,13年过去了,新的C++标准C++11也接近尾声了,你猜怎么着?让两位委员没想到的是,这次更新依然没有包含GC,而是包含了一个高级线程库。在这篇文章中,我将描述C++11标准中发生的最新变化,以及为什么要注意这些变化。正如您将看到的,线程库并不是唯一的变化。新标准吸收了数十名专家。注释使C++更有意义。正如RogersCadenhead指出的那样,它们就像迪斯科舞厅、宠物摇滚和毛茸茸的奥林匹克游泳运动员一样不可思议。首先,让我们看一下C++11核心语言的一些显着特征。Lambda表达式Lambda表达式允许您在本地定义函数,即在调用它们的地方,从而消除许多由函数对象引起的安全风险。Lambda表达式的格式如下:[capture](parameters)->return-type{body}[]是函数调用的参数列表,表示一个Lambda表达式的开始,我们来看一个Lambda例子:假设想统计一个字符串包含多少个大写字母,使用for_each()遍历一个char数组,下面的Lambda表达式判断每个字母是否为大写字母,只要找到大写字母,Lambda表达式就将Uppercase加1,这是在Lambda表达式之外定义的变量:intmain(){chars[]="HelloWorld!";intUppercase=0;//由thelambda修改for_each(s,s+sizeof(s),[&Uppercase](charc){if(isupper(c))Uppercase++;});cout<<大写字母<<"大写字母:"<&vi){vector::const_iteratorci=vi.begin();关键字auto并不是一个新事物,我们早就知道了,它其实可以追溯到前ANSIC时代,但是,C+++11改变了它的含义,auto不再指定自动存储类型对象,而是,它声明的对象类型是从初始化代码中推断出来的,C++11删除了auto关键字的旧含义以避免混淆,C++11提供了类似的机制来捕获对象或表达式的类型,新的运算符decltype接受一个表达式并返回它的类型。构造向量vi;typedefdecltype(vi.begin())CIT;CITanother_const_iterator;统一初始化语法C++至少有4个不同的初始化符号,其中一些符号是重叠的。括号初始化语法如下:std::strings("hello");intm=int();//defaultinitialization在某些情况下,也可以使用“=”符号进行初始化:std::strings="hello";整数=5;对于POD聚合,也可以使用大括号:intarr[4]={0,1,2,3};structtmtoday={0};***,构造函数用成员初始化:structS{intx;S():x(0){}};显然,这么多的初始化方法会造成混乱,这对新手来说更是痛苦。更糟糕的是,在C++03中,您无法初始化POD数组成员。POD数组是使用new[]分配的,C++11使用统一大括号符号来清理这个烂摊子。C类{inta;积分;公共:C(inti,intj);};Cc{0,0};//C++11only.Equivalentto:Cc(0,0);int*a=newint[3]{1,2,0};/C++11onlyclassX{inta[4];public:X():a{1,2,3,4}{}//C++11,memberarrayinitializer};关于容器,你可以告别一长串的push_back()调用。在C++11中,可以直观的初始化容器://C++11containerinitializervectorvs={"first","second","third"};mapsingers={{"LadyGaga","+1(212)555-7890"},{"BeyonceKnowles","+1(212)555-0987"}};同样,C++11支持数据成员的类内初始化:classC{inta=7;//C++11onlypublic:C();};#p#DeletedandDefaultedfunctionsFunctionsinaform:structA{A()=default;//C++11virtual~A()=default;//C++11};被称为默认函数,“=默认;”告诉编译器为该函数生成默认实现。Defaulted函数有两个优点:它比手动实现更高效,并且将程序员从手动定义这些函数的苦差事中解放出来。与默认函数相反的是删除函数:intfunc()=delete;deleted函数对于防止对象复制很有用。回想一下,C++会自动为类声明复制构造函数和赋值运算符。要禁用复制,声明这两个特殊的成员函数=delete就足够了:structNoCopy{NoCopy&operator=(constNoCopy&)=delete;NoCopy(constNoCopy&)=删除;};没有副本;是的,nullptr替代了容易出错的null和字面量0,它们被用作空指针替代多年,而且nullptr是强类型:voidf(int);//#1voidf(char*);//#2//C++03f(0);//调用了哪个?//C++11f(nullptr)//明确,calls#2nullptr适用于所有指针类别,包括函数指针和成员指针:constchar*pc=str.c_str();//数据指针if(pc!=nullptr)cout<//C++11code//arealloftheelementpositive?all_of(first,first+n,ispositive());//false//isthereastonepositiveelement?any_of(first,first+n,ispositive());//true//没有一个元素是正的?none_of(first,first+n,ispositive());//false也有新的copy_n算法,使用copy_n()函数,将一个包含5个元素的数组复制到另一个数组的代码如下:#includeintsource[5]={0,12,34,50,80};inttarget[5];//copy5elementsfromsourcetotargetcopy_n(source,5,target);算法iota()创建了一个顺序递增的值范围,就好像先给*赋初值,然后使用前缀++递增该值,在下面的代码中,iota()赋值??连续的值{10,11,12,13,14}赋给数组arr,并将{'a','b','c'}赋值给char数组c。includeinta[5]={0};charc[3]={0};iota(a,a+5,10);//changesato{10,11,12,13,14}iota(c,c+3,'a');//{'a','b','c'}C++11仍然缺少一些有用的库,比如XMLAPI、sockets、GUI、reflection和前面提到的A合适自动垃圾收集器,但C++11确实带来了很多新特性,让C++更安全、更高效,更易学易用。如果C++11的变化对你来说太大了,不要惊慌,花时间慢慢消化它,当你完全吸收C++11的变化时,你可能会同意Stroustrup:C++11感觉像是一种新语言,一种更好的新语言。原始来源:http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/原名:C++11的最大变化[编辑]推荐】实用主义者的观点:如何学会使用C++程序员的新绝招:Java和C++混合编程