homework-06-C++11
http://blog.csdn.net/lancelet/article/details/7220558
http://www.csdn.net/article/2012-05-15/2805585
http://wenku.it168.com/d_001049706.shtml
http://mindhacks.cn/2012/08/27/modern-cpp-practices/
http://www.cnblogs.com/zhuyp1015/category/370450.html
新特性
c++11一方面对c++的语言特性进行了拓展,一方面又对它容易令人混淆和纠结不清的地方做了规定。我阅读了一些奇奇怪怪的博客,打算就谈以下几点我比较感兴趣且作为一个没有任何c++编程基础的人能理解的新特性:
1、Lambda函数与表示式
C++中,标准程序库算法函数是很有效的东西,而诸如 sort 和 find,用户经常希望能够在算法函数调用的附近定义一个临时的述部函数。由于语言本身允许在函数内部定义类型,可以考虑使用函数对象,然而这通常既麻烦又冗赘。
C++11 对 lambda 的支持可以解决上述问题。
一个 lambda 函数可以用如下的方式定义:
[](int x, int y) { return x + y; }
表示接受0个外部变量,2个参数,返回两个参数x和y的和。
2、初始化列表
C++允许多种初始化方式,比如说 String s="shabi" 或者String s=new String("shabi")。C++11约定了使用{}来进行标准化的初始化。
比如:SequenceClass someVar = {1, 4, 5, 6};
vector<string> v = { "xyzzy", "plugh", "abracadabra" };
3、类型推导
有被明确初始化的变量可以使用 auto 关键字。这会依据该初始化子(initializer)的具体类型产生变量:
auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);
auto otherVariable = 5;
someStrangeCallableType 的类型就是模板函数 boost::bind 对特定引数所回返的类型。作为编译器语义分析责任的一部份,这个类型能够简单地被编译器决定,但用户要通过查看来判断类型就不是那么容易的一件事了。
4、以范围为基础的 for 循环
Boost C++ 定义了许多"范围 (range) "的概念。范围表现有如受控制的串行 (list),持有容器中的两点。有序容器是范围概念的超集 (superset),有序容器中的两个迭代器 (iterator) 也能定义一个范围。这些概念以及操作的算法,将被并入 C++11 标准程序库。不过 C++11 将会以语言层次的支持来提供范围概念的效用。
for 述句将允许简单的范围迭代:
int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
x *= 2;
}
上面 for 述句的第一部份定义被用来做范围迭代的变量,就像被声明在一般 for 循环的变量一样,其作用域仅只于循环的范围。而在":"之后的第二区块,代表将被迭代的范围。这样一来,就有了能够允许 C-style 数组被转换成范围概念的概念图。这可以是 std::vector,或是其他符合范围概念的对象。
疑问和分析
1、lambda没问题么?
lambda函数终于出现在c++了,应用在sort,find这类需要传入简短函数中感觉还算不错,不过lambda表达式早已经在很多语言上都提供支持了,使用lambda表达式对于增加语言的简洁性有着不错的效果。不过在c++这种遍地是指针的古老的命令式风格的语言中,引入这种函数式编程的东西没问题么。
2、c++的“一致化”语法风格到底是什么?
有人说,c++11“使得 C++ 成为更易于教学的语言(语法更加一致化和简单化)”,不是很能理解这里所说的一致化和简单化,c++11中加入的新语法特性显然是让语法更复杂化。而那些对c++语法的限制和规定也只是小修小补,大部分只是为了让老程序员意识到:”哦,以前我这么做很麻烦而且会产生歧义,现在它帮我限制了自己“。 这也只是对老手而言,对于我这种新手看来还是感觉很复杂,语法繁多。
3、c++的优势是什么?c++11对c++带来了什么好处?
在我的理解中,c++的优势在于其具有很强的标准库(STL),比较好的元编程支持(容器),和从c语言继承过来的高效率。但它对面向对象的支持没有java做得彻底和规范,效率没有c高,元编程没有Lisp,Ruby强,语法规则也没有Python,Lisp简洁。 所以C++新特性并没有对c++的定位带来多少改观,经验丰富的c++程序会觉得它对自己带来了很好的便利性,而对于使用其他语言编程的程序员来说吸引力不大。
4、c++吸收了lambda表达式为何不再做得彻底点?
在摩尔定律达即将达到极限,并行计算受到关注的现在,我觉得函数式语言特性会是以后编程语言发展的主要趋势。可以看到比较新的语言比如python,ruby都大量支持函数式编程风格,更别说打着函数式语言名头的scala,haskell,lisp家族的clojure,racket。函数式编程是基于lambda calculus公理设计的,是一套和图灵机等价的计算模型(出现的比图灵机早,八卦一下,它的发明者是图灵的导师丘奇)。它的一个很大的特点是:函数是一种基本类型。这种对于”计算能力“的抽象使得其可以把每一个函数分发给不同的cpu,来实现很方便的并行编程。lambda 表达式的威力在c++中似乎只剩下了”传递一个临时函数指针“,所以我觉得只能说c++是为了赶时髦而吸收了lambda表达式,把它加入到古老的c++语法里的目的仅仅是为了方便而已,而其背后强大的并行计算潜力被忽视了。
5、不会c++/c#的人是不是就不适合去微软工作了?
由于种种原因,我基本没学过c++和c#。据我推测,微软的员工很有可能被要求使用windows系统,使用windows+vs作为开发环境,使用c# .net开发图形界面,使用c++开发底层程序。由于种种不为人知的原因,我习惯使用linux系统,用linux下各种open的工具来开发程序。从对环境的认同感和适应性来说,这种人是不是不大适合去微软工作?
总结
总而言之,由于自身”基本没用过c++“,所以很多新特性看得都云里雾里,难以深入理解。由于知识面的限制,很有可能我对c++11的理解是”完全错误的“,所以如有说错请多包涵。
homework-06-C++11的更多相关文章
- 深入理解ThreadLocal(转)(2015年06月11日)
注明:转自:http://my.oschina.net/clopopo/blog/149368 学习一个东西首先要知道为什么要引入它,就是我们能用它来干什么.所以我们先来看看ThreadLocal对我 ...
- Mybatis源码解析(一)(2015年06月11日)
一.简介 先看看Mybatis的源码结构图,Mybatis3.2.7版本包含的包共计19个,其他版本可能会少. 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为 ...
- homework -06 围棋
playPrev功能的实现 public void playPrev(ref GoMove gm) { Point p = gm.Point; m_colorToPlay = gm.Color; cl ...
- homework 08_2 C++11新特性作业之二
---恢复内容开始--- 1.使用Lambda表达式计算“hello world!”中字母e和i的数量 下面是代码: #include "stdafx.h" #include< ...
- [Laravel] 06 - Project: from Usercase to View
故事背景 一.项目预览 From: https://www.imooc.com/video/12518 二.知识点 通过项目复习之前的重难点,在此列出并解决. /* implement */ 项目开始 ...
- Redis-4.0.11集群配置
版本:redis-3.0.5 redis-3.2.0 redis-3.2.9 redis-4.0.11 参考:http://redis.io/topics/cluster-tutorial. 集群 ...
- CentOS8安装fastdfs6.06
目录 一.准备环境 二.解压并编译安装 1.解压下载好的包 2.编译安装 2.1.编译安装 libfastcommon 2.2.编译安装 fastdfs 2.3.安装 nginx 和 fastdfs- ...
- Final阶段第1周/共1周 Scrum立会报告+燃尽图 03
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2482] 版本控制:https://git.coding.net/liuyy08 ...
- 福大软工1816 · 评分结果 · Alpha冲刺答辩总结
作业地址:https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2462 作业提交准则 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒 ...
- Oracle 11203 + ASM安装 for HP UX
一,安装前准备 1.创建所需组和用户 /usr/sbin/groupadd -g 1000 oinstall/usr/sbin/groupadd -g 1020 asmadmin/usr/sbin/g ...
随机推荐
- Android中的多线程
final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.han ...
- "hadoop namenode -format"命令的作用和影响的文件
在hadoop部署好了之后是不能马上应用的,而是对配置的文件系统进行格式化.这里的文件系统,在物理上还未存在,或者用网络磁盘来描述更加合适:还有格式化,并不是传统意义上的磁盘清理,而是一些清除与准备工 ...
- uboot---linux
01uboot是没有虚拟地址的 02内存映射是linux内核的机制,也就是从实地址到虚拟地址是linux完成的! -----
- 查看mssql死锁的详细信息(存储过程)
CREATE procedure [dbo].[sp_who_lock]asbegindeclare @spid int,@bl int, @intTransactionCountOn ...
- IntelliJ IDEA For Mac 快捷键——常用版
一.搜索 搜索文件 command+shift+n 打开方法实现类 command+option+b 全文搜索 ctrl+shift+f (1)类和方法 查看类的继承结构 ctrl+h 查看方法的 ...
- git push提示或错误
当 git 和 gerrit 一起使用的时候,你创建了一个 tag,现在需要 push 到远程仓库,当你没有权限的时候,会出现如下提示: $ git push origin v20150203 Tot ...
- ha_innobase::open
http://mysql.taobao.org/monthly/2015/08/07/ /******************************************************* ...
- U盘启动格式
U盘的几种启动模式:USB-HDD.USB-ZIP.USB-HDD+.USB-ZIP+.USB-CDROM 1. USB-HDD 硬盘仿真模式,DOS启动后显示C:盘,HP U盘格式化工具制作的U盘 ...
- fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭
在默认情况下,fancybox点击之后弹出窗口,右上角带有一个XX,但是点击窗口的其他遮罩层或者是其他地方,都是可以关闭fancybox的,有些时候,我们不希望这样关闭,而是只能点击右上角关闭,那么设 ...
- [FIX BUG]获取theme中自定义textColor时报的错误
我在Fragment中inflate它都可以,可是一旦使用ListView来inflate就会报错,说找不到我自定义的attr!研究了半天发现是我的inflate的context有问题: view = ...