作为一种计算机语言,C++经历了很多的发展和变化。当然,这些变化并非一蹴而就。C++曾经缺乏活力和创新,所以很冷门。但在C++标准委员会决定加速该语言的开发后,情况发生了变化。自2011年以来,C++已成为一种充满活力、不断发展并广受喜爱的计算机语言。C++经过改造后并没有简单多少,它仍然是最难的编程语言之一。不过,C++确实比以前更加人性化了。这篇文章讲的是C++的一些新特性(以8岁的C++11为例),相信每个程序员都会对这个话题感兴趣。注意:本文跳过了一些高级功能。1.关键字auto当C++11第一次引入auto时,程序员们喜极而泣!auto的意思是让C++编译器在编译时就推导出数据类型,这样就不用每次up都声明数据类型了。当数据类型为map>>withoutinitializer时,无法声明数据类型(见第五行)。这是有道理的。第五行指令不让编译器推断数据类型。起初,auto的功能比较有限。在后来的C++版本中,auto的功能越来越强大。第七行和第八行使用括号初始化(bracketedinitialization),这也是C++11的新特性之一。请注意,使用auto时,编译器必须能够推断出数据类型。一个有趣的问题是:如果你写autoa={1,2,3}会发生什么?这是编译错误吗?它是一个向量吗?实际上,C++11引入了std::initializer_list。如果您声明auto,则大括号初始化列表将被视为轻量级容器。最后,如前所述,编译器类型推断在数据结构复杂时很有用:不要忘记检查第25行!auto[v1,v2]=itr.second纯粹是C++17的新特性。此功能称为结构化绑定。在旧版本的C++中,程序员需要单独访问每个变量。但是结构化绑定促进了这个过程。另外,如果想使用引用(reference)获取数据,只需要加上一个符号--auto&[v1,v2]=itr.second.2。Lambda表达式C++11引入了lambda表达式,类似于JavaScript中的匿名函数。它们都是函数对象,没有名字,基于简洁的语法捕获不同作用域的变量。它们也可以分配给变量。当您需要在代码中做一些小而快的事情,但又不想为它编写一个单独的函数时,Lambda很有用。另一种常见用法是将lambda用作比较函数。上面的例子可以说明很多问题。首先,请注意支撑初始化如何增加权重。然后就是通用的begin()、end()(这也是C++11新增的部分)。接下来是充当数据比较器的lambda函数。lambda函数的参数声明为自动(这是C++14的新功能)。在C++14之前,auto不能用于函数参数。正如现代C++库中所定义的那样:[]-不捕获任何对象。所以你不能在lambda表达式中使用全局范围的局部变量,只能使用参数。[=]—按值捕获范围内的局部对象(局部变量、参数)。只能使用不能修改。[&]—通过引用捕获范围内的局部对象(局部变量、参数)。可以修改。例子如下。[this]——按值捕获this指针。[a,&b]-通过值捕获对象a,通过引用捕获对象b。所以,如果你想在lambda函数内部将数据转换成其他格式,你可以利用作用域优势来使用lambda。例如:在上面的例子中,如果你在lambda表达式中按值捕获([factor])局部变量,你不能在第五行改变factor。原因很简单——没有权限。最后,请注意示例中使用val作为引用。这确保了lambda函数内部的任何更改都会更改向量。学习现代C++后,他们很高兴!(照片:IanSchneider来源:Unsplash)3.if/switch中的初始化语句C++17的这一特性非常令人愉悦:很明显,现在可以在if/switch块中同时执行变量初始化和条件检查。这有助于保持代码简洁明了。一般形式为:if(init-statement(x);condition(x)){//dosomestuffhere}else{//elsehasthescopeofx//dosomeotherstuff}4.编译时使用constexprConstexpr很棒!假设你要计算一些表达式,并且它的值一旦初始化就不会改变,所以它的值可以预先计算并用作宏。或者利用C++11提供的constexpr。程序员倾向于最小化程序运行时间。所以,如果能让编译器做点什么,减轻程序运行的压力,那么就可以缩短运行时间。上面的代码是constexpr的常见示例之一。由于Fibonacci序列函数被声明为constexpr,编译器可以在编译时预先计算fib(20)。所以编译后可以用constlonglongbigval=2432902008176640000代替constlonglongbigval=fib(20)。请注意,传递的参数是一个常量值。这是声明为constexpr的函数的一个重点——传递的参数应该是constexpr或const。否则,这里的函数会和普通函数一样,也就是说编译时不会做预计算。变量也可以是constexpr。在这种情况下,这些变量在编译时必须是可评估的;否则会出现编译错误。有趣的是,后来在C++17中引入了constexpr-if和constexpr-lambda.5。元组与对非常相似,元组是各种数据类型的固定大小值的集合。有时使用std::array比tuple更方便。array类似于具有C++标准库功能的普通C数组。这个数据结构是C++11的新特性。6.类模板参数推导这个特性的名字比较啰嗦。从C++17开始,模板参数推导也可用于标准类模板。以前,模板参数推导仅支持函数模板。结果是:std::pairuser={"M",25};//previousstd::pairuser={"M",25};//C++17这个推导是“隐”。这对于元组来说更加方便。//previousstd::tupleuser("M","Chy",25);//推导inaction!std::tupleuser2("M","Chy",25);上面的这个特性对于不熟悉C++模板的人来说用处不大。7.智能指针指针有时很吓人。因为C++语言为程序员提供了很大的自由度,所以有时候很容易搬起石头砸自己的脚。并且在很多情况下,问题是由指针引起的。好在C++11引入了智能指针,比普通指针方便多了。它们通过及时释放内存来帮助程序员防止内存泄漏。它们还帮助代码实现异常安全级别。