新的keyword

auto

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

auto的自己主动类型推导,用于从初始化表达式中判断出变量的数据类型。通过auto的自己主动类型推导。能够大大简化我们的编程工作。auto实际上实在编译时对变量进行了类型推导,所以不会对程序的执行效率造成不良影响。另外。似乎auto并不会影响编译速度,由于编译时本来也要右側推导然后判断与左側是否匹配。假设没有autokeyword 写个迭代器要写非常长长,这也算是节省了我们的脑细胞吧,~~~~(>_<)~~~~ !

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这一模板參数:

template <typename Product, typename Creator>
void processProduct(const Creator& creator) {
Product* val = creator.makeObject();
// do somthing with val
}

假设使用auto,则能够这样写:

template <typename Creator>
void processProduct(const Creator& creator) {
auto val = creator.makeObject();
// do somthing with val
}

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

decltype

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

int x = 3;
decltype(x) y = x;//那么非常easy理解y的类型就是int啦

有人会问,decltype的有用之处在哪里呢,我们接着上边的样例继续说下去,假设上文中的加

工产品的样例中我们想把产品作为返回值该怎么办呢?我们能够这样写:

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。

void F(int a){
cout<<a<<endl;
}
void F(int *p){
assert(p != NULL);
cout<< p <<endl;
}
int main(){
int *p = nullptr;
int *q = NULL;
bool equal = ( p == q ); // equal的值为true,说明p和q都是空指针
int a = nullptr; // 编译失败。nullptr不能转型为int
F(0); // 在C++98中编译失败,有⼆二义性。在C++11中调⽤用F(int)
F(nullptr);
return 0;
}

序列for循环

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

map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
for (auto p : m){
cout<<p.first<<" : "<<p.second<<endl;
}

Lambda表达式

lambda表达式类似Javascript中的闭包,它能够用于创建并定义匿名的函数对象,以简化编程

工作。Lambda的语法例如以下:

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

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构造。构造一个包括两种不同类型的数据的

容器。比方,例如以下代码:

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

因为在C++11中引入了变长參数模板,所以发明了新的数据类型:tuple,tuple是一个N元组。能够传入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

template<typename head, typename... tail>
void Print(Head head, typename... tail) {
cout<< head <<endl;
Print(tail...);
}

Print中能够传入多个不同种类的參数,例如以下:

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

更加优雅的初始化方法

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

int arr[3] = {1, 2, 3}
vector<int> v(arr, arr + 3);

在C++11中,我们能够使用下面语法来进行替换:

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.

本人cocos2dx 2.x和3.x的源代码淘宝地址(欢迎大家光顾):https://shop141567464.taobao.com/?

spm=a313o.7775905.1998679131.d0011.aYDdAj

不懂的能够加我的QQ群: 239982941(cocos2d-x 3.1.1学习群

Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性的更多相关文章

  1. 【转】Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

    [转]Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性 Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

  2. c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...

  3. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

  4. C++11新特性学习

    http://www.cprogramming.com/c++11/c++11-lambda-closures.html

  5. 【SharePoint学习笔记】第3章 SharePoint列表新特性以及数据访问

    第3章 SharePoint列表新特性以及数据访问   使用CAML查询语言     CAML:协作应用程序标记语言 Collaboration Application Markup Language ...

  6. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  7. Tomcat学习总结(9)——Apache Tomcat 8新特性

    一.Apache Tomcat 8介绍 Apache Tomcat 8RC1版于2013年8月份发布.它 经过了2年的开发,引入了很多新特征,由于目前还只是Alpha版,故不推荐在产品中使用.但是我们 ...

  8. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  9. c++11新特性学习2

    noexcept 替代 throw.优点是更安全, 如果noexcept 修饰的函数抛出了异常,编辑器可以直接选择终止程序. C++ 11中析构函数默认为noexcept(true),从而阻止异常的扩 ...

随机推荐

  1. Oracle EBS-SQL (PO-11):检查采购订单退货数.sql

    select msi.segment1                                    物料编码,     --  msi.inventory_item_id return_it ...

  2. QTcpSocket 及 TCP粘包分析

    ----我的生活,我的点点滴滴!! 这两天用Qt简单的实现一个tcp多线程client,在此记录下知识. 一.长连接与短连接 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开 ...

  3. xxx.java: Recompile with -Xlint:deprecation for details

    警告而已.有些方法1 已经过时,有更好的方法可以代替,比如 new java.util.Date().getYear(); => cal.get(Calendar.YEAR);2 发现过问题,且 ...

  4. CC++初学者编程教程(8) VS2013配置编程助手与QT

    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 ...

  5. 【COM学习】之二、HRESULT,GUID

    HRESULT 来向用户报告各种情况.   他的值位于  WINERROR.H中 QueryInterface返回一个HRESULT值. HRESULT不是一个句柄,他是一个可分成三个域的32位值. ...

  6. Java线程之二 锁定与等待堵塞原理图

    如上图所看到的.

  7. java与javac命令笔记

    Java对待.java文件与.class文件是有区别的.对.java文件可以直接指定路径给它,而java命令所需的.class文件不能出现扩展名,也不能指定额外的路径给它,对于Java所需的.clas ...

  8. OC语法1——OC概述

    Object-C简介: OC,即Object-C,iOS开发的核心语言.它是基于C语言的,在C的基础上做了面向对象的封装,所以OC是面向对象的语言.同时也因此OC是兼容C的,也就是说在iOS开发中,可 ...

  9. mysql数据类型整理

    mysql 中数据类型主要有三种 文本.数字 ,日期/时间 文本类型:char 定长,varchar变长,都是最多65535,char多了会截取,varchar少了自动补长.text最多65535,b ...

  10. werkzeug源码阅读笔记(二) 下

    wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...