【现代程序设计】【homework-07】
2013-11-10 20:10
246 查看
C++11 中值得关注的几大变化
1.Lambda 表达式
Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure(闭包)。表达式的简单语法如下
View Code
所以,C++引入Lambda的最主要原因就是1)可以定义匿名函数,2)编译器会把其转成函数对象。相信你会和我一样,会疑问为什么以前STL中的ptr_fun()这个函数对象不能用?(ptr_fun()就是把一个自然函数转成函数对象的)。原因是,ptr_fun() 的局限是其接收的自然函数只能有1或2个参数。
那么,除了方便外,为什么一定要使用Lambda呢?它比传统的函数或是函数对象有什么好处呢?我个人所理解的是,这种函数之年以叫“闭包”,就是因为其限制了别人的访问,更私有。也可以认为他是一次性的方法。Lambda表达式应该是简洁的,极私有的,为了更易的代码和更方便的编程。
[b]2.自动类型推导 auto[/b]
在在这一节中,原文主要介绍了两个关键字 auto 和 deltype,示例如下
[b]3.自动化推导 decltype[/b]
关于
如果表达式e是一个变量,那么就是这个变量的类型。
如果表达式e是一个函数,那么就是这个函数返回值的类型。
如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。
原文给出的示例如下,我们可以看到,这个让的确我们的定义变量省了很多事。
还有一个适合的用法是用来typedef函数指针,也会省很多事。比如:
C/C++的初始化的方法比较,C++ 11 用大括号统一了这些初始化的方法。
比如:POD的类型。
关于POD相说两句,所谓POD就是Plain Old Data,当class/struct是极简的(trivial)、属于标准布局(standard-layout),以及他的所有非静态(non-static)成员都是POD时,会被视为POD。如:
POD的初始化有点怪,比如上例,new A; 和new A(); 是不一样的,对于其内部的m,前者没有被初始化,后者被初始化了(不同 的编译器行为不一样,VC++和GCC不一样)。而非POD的初始化,则都会被初始化。
从这点可以看出,C/C++的初始化问题很奇怪,所以,在C++ 2011版中就做了统一。原文作者给出了如下的示例:
容器的初始化:
还支持像Java一样的成员初始化:
1.Lambda 表达式
Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure(闭包)。表达式的简单语法如下
template <class T> class less { public: bool operator()(const T&l, const T&r)const { return l < r; } };
View Code
所以,C++引入Lambda的最主要原因就是1)可以定义匿名函数,2)编译器会把其转成函数对象。相信你会和我一样,会疑问为什么以前STL中的ptr_fun()这个函数对象不能用?(ptr_fun()就是把一个自然函数转成函数对象的)。原因是,ptr_fun() 的局限是其接收的自然函数只能有1或2个参数。
那么,除了方便外,为什么一定要使用Lambda呢?它比传统的函数或是函数对象有什么好处呢?我个人所理解的是,这种函数之年以叫“闭包”,就是因为其限制了别人的访问,更私有。也可以认为他是一次性的方法。Lambda表达式应该是简洁的,极私有的,为了更易的代码和更方便的编程。
[b]2.自动类型推导 auto[/b]
在在这一节中,原文主要介绍了两个关键字 auto 和 deltype,示例如下
[b]3.自动化推导 decltype[/b]
关于
decltype是一个操作符,其可以评估括号内表达式的类型,其规则如下:
如果表达式e是一个变量,那么就是这个变量的类型。
如果表达式e是一个函数,那么就是这个函数返回值的类型。
如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。
原文给出的示例如下,我们可以看到,这个让的确我们的定义变量省了很多事。
C/C++的初始化的方法比较,C++ 11 用大括号统一了这些初始化的方法。
比如:POD的类型。
从这点可以看出,C/C++的初始化问题很奇怪,所以,在C++ 2011版中就做了统一。原文作者给出了如下的示例:
相关文章推荐
- 现代程序设计 homework-07
- 现代程序设计 homework-07
- 现代程序设计——homework-07
- 【现代程序设计】homework-08
- 现代程序设计——homework-06
- 【现代程序设计】homework-05
- 【现代程序设计】【homework-08】
- My First Blog on cnblogs (现代程序设计 Homework-01)
- 现代程序设计 homework-03
- 【现代程序设计】【homework-04】
- 现代程序设计 homework-08
- 【现代程序设计】homework-04
- 现代程序设计 homework-05
- 现代程序设计homework-06
- 【现代程序设计】【homework-03】【11061027】
- 【现代程序设计】homework-03
- 现代程序设计 homework-05
- 现代程序设计 homework-08
- 现代程序设计 homework-02
- [现代程序设计]homework-03