C++11新特性

新的关键字

auto

C++11中引入auto第一种作用是为了自动类型推导。

auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以大大简化我们的编程工作。auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响。另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。如果没有auto关键字 写个迭代器要写很长长,这也算是节省了我们的脑细胞吧。


1

2

3

4

5

6

7

8

9

10


auto a;      // 错误,auto是通过初始化表达式进⾏行类型推导,如果没有初始化表达式,就⽆无法确定a

的类型

auto i = 1;

auto d = 1.0;

auto str =      "Hello World"     ;

auto ch =      'A'     ;

auto func = less<     int     >();

vector<     int     > iv;

auto ite = iv.begin();

auto p =      new      foo()      // 对⾃自定义类型进⾏行类型推导

auto不光有以上的应用,它在模板中也是大显身手,比如下例这个加工产品的例子中,如果不使用auto就必须声明Product这一模板参数:


1

2

3

4

5


template      <     typename      Product,      typename      Creator>

void      processProduct(     const      Creator& creator) {

Product* val = creator.makeObject();

// do somthing with val

}

如果使用auto,则可以这样写:


1

2

3

4

5


template      <     typename      Creator>

void      processProduct(     const      Creator& creator) {

auto val = creator.makeObject();

// do somthing with val

}

抛弃了麻烦的模板参数,整个代码变得更加正解了。

decltype

decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,有实例如下:


1

2


int      x = 3;

decltype(x) y = x;     //那么很容易理解y的类型就是int啦

有人会问,decltype的实用之处在哪里呢,我们接着上边的例子继续说下去,如果上文中的加工产品的例子中我们想把产品作为返回值该怎么办呢?我们可以这样写:


1

2

3

4

5

6


template      <     typename      Creator>

auto processProduct(     const      Creator& creator) ->

decltype(creator.makeObject()) {

auto val = creator.makeObject();

// do somthing with val

}

nullptr

nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0。

序列for循环

在C++中for循环可以使用类似java的简化的for循环,可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator),示例代码如下:


1

2

3

4


map<string,      int     > m{{     "a"     , 1}, {     "b"     , 2}, {     "c"     , 3}};

for      (auto p : m){

cout<<p.first<<     " : "     <<p.second<<endl;

}

Lambda表达式

lambda表达式类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。Lambda的语法如下:

[函数对象参数](操作符重载函数参数)->返回值类型{函数体}


1

2

3

4

5


vector<     int     > iv{5, 4, 3, 2, 1};

int      a = 2, b = 1;

for_each(iv.begin(), iv.end(), [b](     int      &x){cout<<(x + b)<<endl;});      // (1)

for_each(iv.begin(), iv.end(), [=](     int      &x){x *= (a + b);});      // (2)

for_each(iv.begin(), iv.end(), [=](     int      &x)->     int     {     return      x * (a + b);});     //(3)

[]内的参数指的是Lambda表达式可以取得的全局变量。(1)函数中的b就是指函数可以得到在Lambda表达式外的全局变量,如果在[]中传入=的话,即是可以取得所有的外部变量,如(2)和(3)Lambda表达式()内的参数是每次调用函数时传入的参数。

->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变量。

变长参数的模板

我们在C++中都用过pair,pair可以使用make_pair构造,构造一个包含两种不同类型的数据的容器。比如,如下代码:


1

auto p = make_pair(1,      "C++ 11"     );

由于在C++11中引入了变长参数模板,所以发明了新的数据类型:tuple,tuple是一个N元组,可以传入1个, 2个甚至多个不同类型的数据。


1

2


auto t1 = make_tuple(1, 2.0,      "C++ 11"     );

auto t2 = make_tuple(1, 2.0,      "C++ 11"     , {1, 0, 2});

这样就避免了从前的pair中嵌套pair的丑陋做法,使得代码更加整洁。

另一个经常见到的例子是Print函数,在C语言中printf可以传入多个参数,在C++11中,我们可以用变长参数模板实现更简洁的Print:


1

2

3

4

5


template     <     typename      head,      typename     ... tail>

void      Print(Head head,      typename     ... tail) {

cout<< head <<endl;

Print(tail...);

}

Print中可以传入多个不同种类的参数,如下:


1

Print(1, 1.0,      "C++11"     );


更加优雅的初始化方法

在引入C++11之前,只有数组能使用初始化列表,其他容器想要使用初始化列表,只能用以下方法:


1

2


int      arr[3] = {1, 2, 3}

vector<     int     > v(arr, arr + 3);

在C++11中,我们可以使用以下语法来进行替换:


1

2

3

4


int      arr[3]{1, 2, 3};

vector<     int     > iv{1, 2, 3};

map<     int     , string>{{1,      "a"     }, {2,      "b"     }};

string str{     "Hello World"     };

此外,智能指针也是挺好用的,一句代码写数据类型几百个字符。但是vs2012不怎么支持C++11,所以要用C++11的建议装vs2013。

原文地址:http://cn.cocos2d-x.org/tutorial/show?id=1120

时间: 2025-01-21 19:25:20

C++11新特性的相关文章

C++ 11 新特性

C++ 11  新特性 类内成员赋初值 类内数据成员允许赋默认值. C11以前是会报错的.ISO C++ forbids initialization of member `name_var_' lambda表达式 lambda表达式本质上是一个未命名的内联函数. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式,简化编程.l

《深入理解C++11:C++ 11新特性解析与应用》——第1章 新标准的诞生 1.1 曙光:C++11标准的诞生

第 1 章 新标准的诞生 从最初的代号C++0x到最终的名称C++11,C++的第二个真正意义上的标准姗姗来迟.可以想象,这个迟来的标准必定遭遇了许多的困难,而C++标准委员会应对这些困难的种种策略,则构成新的C++语言基因,我们可以从新的C++11标准中逐一体会.而客观上,这些基因也决定了C++11新特性的应用范畴.在本章中,我们会从设计思维和应用范畴两个维度对所有的C++11新特性进行分类,并依据这种分类对一些特性进行简单的介绍,从而一览C++11的全景. 1.1 曙光:C++11标准的诞生

《深入理解C++11:C++ 11新特性解析与应用》——1.2 今时今日的C++

1.2 今时今日的C++ 1.2.1 C++的江湖地位 如今C++依旧位列通用编程语言三甲,不过似乎没有以前那么流行了.事实上,编程语言排名通常非常难以衡量.比如,某位教授或学生用了C++来教授课程应该被计算在内吗?在新的联合攻击战斗机(Joint Strike Fighter,JSF-35)的航空电子设备中使用了C++编程应该计算在内吗?又或者C++被用于一款流行的智能手机操作系统的编程中算不算呢?再或者是C++被用于编写最流行的在线付费搜索引擎,或用于构建一款热门的第一人称射击游戏的引擎,或

C++11新特性之auto的使用_C 语言

前言 C++是一种强类型语言,声明变量时必须明确指出其类型.但是,在实践中,优势我们很难推断出某个表达式的值的类型,尤其是随着模板类型的出现,要想弄明白某些复杂表达式的返回类型就变得更加困难.为了解决这个问题,C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准的auto,完全是两个概念. 一.自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型.通过aut

浅析C++11新特性的Lambda表达式_C 语言

lambda简介 熟悉Python的程序员应该对lambda不陌生.简单来说,lambda就是一个匿名的可调用代码块.在C++11新标准中,lambda具有如下格式: [capture list] (parameter list) -> return type { function body } 可以看到,他有四个组成部分:     1.capture list: 捕获列表     2.parameter list: 参数列表     3.return type: 返回类型     4.func

《深入理解C++11:C++ 11新特性解析与应用》——2.9 扩展的friend语法

2.9 扩展的friend语法 类别:部分人 friend关键字在C++中是一个比较特别的存在.因为我们常常会发现,一些面向对象程序语言,比如Java,就没有定义friend关键字.friend关键字用于声明类的友元,友元可以无视类中成员的属性.无论成员是public.protected或是private的,友元类或友元函数都可以访问,这就完全破坏了面向对象编程中封装性的概念.因此,使用friend关键字充满了争议性.在通常情况下,面向对象程序开发的专家会建议程序员使用Get/Set接口来访问类

《深入理解C++11:C++ 11新特性解析与应用》——1.4 C++特性一览

1.4 C++特性一览 接下来,我们会一窥C++11中的各种特性,了解它们的来历.用途.特色等.可能这部分对于还没有开始阅读正文的读者来说有些困难.如果有机会,我们建议读者在读完全书后再回到这里,这也是全书最好的总结. 1.4.1 稳定性与兼容性之间的抉择 通常在语言设计中,不破坏现有的用户代码和增加新的能力,这二者是需要同时兼顾的.就像之前的C一样,如今C++在各种代码中.开源库中,或用户的硬盘中都拥有上亿行代码,那么当C++标准委员会要改变一个关键字的意义,或者发明一个新的关键字时,原有代码

《深入理解C++11:C++ 11新特性解析与应用》——2.14 本章小结

2.14 本章小结 在本章中,我们可以看到C++11大大小小共17处改动.这17处改动,主要都是为保持C++的稳定性以及兼容性而增加的. 比如为了兼容C99,C++11引入了4个C99的预定的宏.__func__预定义标识符._Pragma操作符.变长参数定义,以及宽窄字符连接等概念.这些都是错过了C++98标准,却进入了C99的一些标准,为了最大程度地兼容C,C++将这些特性全都纳入C++11.而由于标准的更新,C++11也更新了__cplusplus宏的值,以表示新的标准的到来.而为了稳定性

《深入理解C++11:C++ 11新特性解析与应用》——第2章 保证稳定性和兼容性 2.1 保持与C99兼容

第 2 章 保证稳定性和兼容性 作为C语言的嫡亲,C++有一个众所周知的特性-对C语言的高度兼容.这样的兼容性不仅体现在程序员可以较为容易地将C代码"升级"为C++代码上,也体现在C代码可以被C++的编译器所编译上.新的C++11标准也并不例外.在C++11中,设计者总是保证在不破坏原有设计的情况下,增加新的特性,以充分保证语言的稳定性与兼容性.本章中的新特性基本上都遵循了该设计思想. 2.1 保持与C99兼容 类别:部分人 在C11之前最新的C标准是1999年制定的C99标准.而第一

《深入理解C++11:C++ 11新特性解析与应用》——第3章 通用为本,专用为末 3.1 继承构造函数

第 3 章 通用为本,专用为末 C++11的设计者总是希望从各种方案中抽象出更为通用的方法来构建新的特性.这意味着C++11中的新特性往往具有广泛的可用性,可以与其他已有的,或者新增的语言特性结合起来进行自由的组合,或者提升已有特性的通用性.这与在语言缺陷上"打补丁"的做法有着本质的不同,但也在一定程度上拖慢了C++11标准的制定.不过现在一切都已经尘埃落定了.在本章里读者可以看到这些经过反复斟酌制定的新特性,并体会其"普适"的特性.当然,要对一些形如右值引用.移动