C++ 0x/11学习笔记

 

C++ 0x/11学习笔记

分类: 又爱又恨的C++   886人阅读  评论(5)  收藏  举报
今天在看微软提供的windows8的相关开发文档和Sample程序,发现有个C++程序的表达方式完全象天书,查了下,原来是C++0x/11新支持的Lambda表达式,本来一直懒得去看C++0x/11的说明,想等用到再去研究,今天趁这个机会稍微浏览了下,大概整理了如下这些新特性,跟大家分享一下。
稍微吐槽下,C++0x/11是继C++ 03后通过的最新的C++标准库,对C++语法特性和开发库两方面都有了新的扩展,说实在话,这个出的也太晚了,03年到11年,IT技术日新月异,而C++标准库才更新了一版,真是C++开发者的悲哀。
闲话表过,进入正题。
1. Lambda表达式
你不学绝对看不懂的一个C++ 11新表达方式。大家可能知道Boost里有Lambda这个库,c++ 11的Lambda功能类似,也是提供匿名函数外加支持类似"闭包"机制。如果要问什么是匿名函数,什么是闭包,这里就不解释了,相信有点javascript基础的都明白。
言归正传,C++ 11中Lambda表达式的标准形式是:
 [外部变量](参数)->返回值 {函数体}
其中““->返回值”部分可以省略,如果省略则会有返回值类型推导。(类型推导在后面auto中会进行说明)
关于外部变量的传递方式如下:
[]无任何外部变量
[x, &y]x以传值方式导入,y以引用方式导入
[&]所有变量都以引用方式导入
[=]所有变量都以传值方式导入
[&, x]除x以传值方式导入外,其他变量以引用方式导入
[=, &z]除z以引用方式导入外,其他变量以传值方式导入

一个简单的例子:
[cpp]  view plain copy
  1. int first = 0;  
  2. int second = 0;  
  3. int third = 1;  
  4.   
  5. int result = [first, &second](int p)->int{  
  6.      //first++;  改变值传递的外部参数,编译器会报错  
  7.      second++;  
  8.      return first + second + p;  
  9. }(third);  

结果:first = 0, second = 1, result = 2

2. 自动类型推导auto
不多解释了,看下面这些结果就明白了。
[cpp]  view plain copy
  1. auto x = 0;   // 因为0是int型,所以x为int类型,  
  2. auto y = 3.14; // y 为double类型  

auto也可以让代码更简单,比如:
[cpp]  view plain copy
  1. vector<int>::const_iterator it = v.begin();  
可以写成:
[cpp]  view plain copy
  1. auto it = v.begin();  
但是滥用auto也会让程序可读性变差,比如:
[cpp]  view plain copy
  1. auto obj = SomeFunction();     // 看不出函数到底返回了什么类型  
而这样用就没有任何问题:
[cpp]  view plain copy
  1. auto obj = new SomeObject();  

3. 初始化语法
通过{}来进行初始化,有如下特性(以前C++是不支持的):
[cpp]  view plain copy
  1. int* x = new int[2]{1, 2};  
  2. vector<int> v = {1, 2};  

另外还支持java方式的初始化
[cpp]  view plain copy
  1. class tempObj {  
  2. public:  
  3.      int x = 10;  
  4. };  

4. delete 和 default 函数
delete告诉编译器不自动产生默认函数,default恰恰相反,它让编译器产生一个默认函数。比如以前C++的类一旦定义了构造函数,就不再支持默认构造函数,C++ 11可以通过default来实现。
[cpp]  view plain copy
  1. class NewObj  
  2. {  
  3.     NewObj() = default// 使用默认构造函数  
  4.     NewObj(int value);  
  5. };  

5. nullptr
避免了曾经NULL的缺陷,所以C++11里,指针初始化都应该设为nullptr。

线程库,智能指针等新功能,这里就不说明了,基本概念都类似,使用的时候一查就明白了。

这里省略n种新特性,等以后我看了再分享吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值