【现代程序设计】【homework-07】
C++11 中值得关注的几大变化
1.Lambda 表达式
Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure(闭包)。表达式的简单语法如下
char s[]="Hello World!"; int Uppercase = 0; //modified by the lambda for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) Uppercase++; }); cout << Uppercase << " uppercase letters in: " << s <<endl;
View Code
在传统的STL中for_each()
这个玩意最后那个参数需要一个“函数对象”,所谓函数对象,其实是一个class,这个class重载了operator(),于是这个对象可以像函数的式样的使用。实现一个函数对象并不容易,需要使用template,比如下面这个例子就是函数对象的简单例子(实际的实现远比这个复杂):
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表达式应该是简洁的,极私有的,为了更易的代码和更方便的编程。
2.自动类型推导 auto
在在这一节中,原文主要介绍了两个关键字 auto 和 deltype,示例如下
auto x=0;
//x has type int because 0 is int
auto c=
'a'
;
//char
auto d=0.5;
//double
auto national_debt=14400000000000LL;
//long long
auto 最大的好处就是让代码简洁,尤其是那些模板类的声明,比如:STL中的容器的迭代子类型。
vector<
int
>::const_iterator ci = vi.begin();
可以变成:
auto ci = vi.begin();
模板这个特性让C++的代码变得很难读,不信你可以看看STL的源码,那是一个乱啊。使用auto必需一个初始化值,编译器可以通过这个初始化值推导出类型。因为auto是来简化模板类引入的代码难读的问题,如上面的示例,iteration这种类型就最适合用auto的,但是,我们不应该把其滥用。
比如下面的代码的可读性就降低了。因为,我不知道ProcessData返回什么?int? bool? 还是对象?或是别的什么?这让你后面的程序不知道怎么做。
auto obj = ProcessData(someVariables);
但是下面的程序就没有问题,因为pObject的型别在后面的new中有了。
auto pObject =
new
SomeType<OtherType>::SomeOtherType();
3.自动化推导 decltype
关于 decltype
是一个操作符,其可以评估括号内表达式的类型,其规则如下:
- 如果表达式e是一个变量,那么就是这个变量的类型。
- 如果表达式e是一个函数,那么就是这个函数返回值的类型。
- 如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。
原文给出的示例如下,我们可以看到,这个让的确我们的定义变量省了很多事。
1
2
3
|
const vector< int > vi;
typedef decltype (vi.begin()) CIT;
CIT another_const_iterator;
|
还有一个适合的用法是用来typedef函数指针,也会省很多事。比如:
decltype(&myfunc) pfunc = 0;
typedef
decltype(&A::func1) type;
Wikipedia 上是这么说的(关于decltype的规则见上)
#include <vector>
int
main()
{
const
std::vector<
int
> v(1);
auto a = v[0];
// a 的类型是 int
decltype(v[0]) b = 1;
// b 的类型是 const int&, 因为函数的返回类型是
// std::vector<int>::operator[](size_type) const
auto c = 0;
// c 的类型是 int
auto d = c;
// d 的类型是 int
decltype(c) e;
// e 的类型是 int, 因为 c 的类型是int
decltype((c)) f = c;
// f 的类型是 int&, 因为 (c) 是左值
decltype(0) g;
// g 的类型是 int, 因为 0 是右值
}
function 模板”,
template
<
typename
LHS,
typename
RHS>
auto AddingFunc(
const
LHS &lhs,
const
RHS &rhs) -> decltype(lhs+rhs)
{
return
lhs + rhs;}
来扩展了已有的模板技术的不足。怎么个不足呢?在上例中,我不知道AddingFunc会接收什么样类型的对象,这两个对象的 +
操作符返回的类型也不知道,老的模板函数无法定义AddingFunc返回值和这两个对象相加后的返回值匹配,所以,你可以使用上述的这种定义。
C/C++的初始化的方法比较,C++ 11 用大括号统一了这些初始化的方法。
比如:POD的类型。
1
2
|
int arr[4]={0,1,2,3};
struct tm today={0};
|
关于POD相说两句,所谓POD就是Plain Old Data,当class/struct是极简的(trivial)、属于标准布局(standard-layout),以及他的所有非静态(non-static)成员都是POD时,会被视为POD。如:
1
2
3
|
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
|
POD的初始化有点怪,比如上例,new A; 和new A(); 是不一样的,对于其内部的m,前者没有被初始化,后者被初始化了(不同 的编译器行为不一样,VC++和GCC不一样)。而非POD的初始化,则都会被初始化。
从这点可以看出,C/C++的初始化问题很奇怪,所以,在C++ 2011版中就做了统一。原文作者给出了如下的示例:
1
2
3
4
5
6
7
8
9
|
C c {0,0}; //C++11 only. 相当于: C c(0,0);
int * a = new int [3] { 1, 2, 0 }; /C++11 only
class X {
int a[4];
public :
X() : a{1,2,3,4} {} //C++11, member array initializer
};
|
容器的初始化:
1
2
3
4
5
|
// C++11 container initializer
vector<string> vs={ "first" , "second" , "third" };
map singers =
{ { "Lady Gaga" , "+1 (212) 555-7890" },
{ "Beyonce Knowles" , "+1 (212) 555-0987" }};
|
还支持像Java一样的成员初始化:
1
2
3
4
5
6
|
class C
{
int a=7; //C++11 only
public :
C();
};
|
转载于:https://www.cnblogs.com/lightz/p/3417006.html
【现代程序设计】【homework-07】相关推荐
- C语言程序设计作业07:第十六周作业
| 这个作业属于哪个课程 C语言程序设计II 我在这个课程的目标是 了解并精通C语言 这个作业在那个具体方面帮助我实现目标 了解函数的编译和构造,认识有些已有的库函数 -参考文献- -C语言程序设计教 ...
- C语言程序设计作业07
这个作业要求在哪里 掌握结构 我在这个课程的目标是 灵活使用结构 这个作业在那个具体方面帮助我实现目标 结构 参考文献 百度,CSDN 1.1节约有理 1.1.1数据处理 1.1.2实验代码截图 1. ...
- 吉林大学超星MOOC高级语言程序设计 实验07(2021级)
1. (程序题) [计2016级期末试题]构造一个表示教师的结构体(包含3个字段:姓名.性别.年龄),编写函数,读入n个教师的信息,存入一个结构体数组中(如下图所示).最后输出第n/2个教师的信息. ...
- 吉林大学 超星慕课 高级语言程序设计 实验07 递归程序设计(2022级)
本人能力有限,发出只为帮助有需要的人. 建议同学们自己写完后再进行讨论. 1.题目名称:排列组合 问题描述:编写程序求函数C(m,n)的值. 输入:从键盘随机输入一个自然数和一个非负整数,分别作为m和 ...
- 河南工业大学2017“玲珑杯”程序设计竞赛 07
1266: 最大子段和 时间限制: 1 秒 内存限制: 64 MB 提交: 276 解决: 55 提交 状态 题目描述 一个大小为n的数组a1到an(−10^4≤ai≤10^4).请你找出一个连续 ...
- c sharp 语言,C Sharp 语言Windows程序设计.ppt
C Sharp 语言Windows程序设计 2010.07 第5章 Windows窗体与控件程序设计 学习要点 1.理解并掌握解决方案的创建及其项目管理 2.熟练掌握窗体的创建方法及其程序设计 3.理 ...
- C/C++程序设计题[2023-05-27]
C/C++程序设计题[2023-05-27] 程序设计题01:媒体信息统计系统 1 问题描述 该系统要求实现一个简单.实用的媒体信息统计程序,主要功能包括媒体信息数据的新增.删除.修改.查找.统计输出 ...
- 人工智能专业基础课程
计算机系统基础(一):程序的表示.转换与链接 课程大纲 01 第一周 计算机系统概述 课时 第1讲 为什么要学习计算机系统基础 第2讲 计算机系统基本组成与基本功能 ...
- 软工+C(9): 助教指南,持续更新...
上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...
- 《面向对象程序设计》第07章在线测试
<面向对象程序设计>第07章在线测试 <面向对象程序设计>第07章在线测试 剩余时间: 59:56 答题须知:1.本卷满分20分. 2.答完题后,请一 ...
最新文章
- c/c++ 获取文件夹或目录下的文件
- 内存延时cl_内存频率和CL延迟哪个重要
- 给定某年日期及该年第一天是星期几然后显示该年的日历
- 个人永久性免费-Excel催化剂功能第119波-一大波虚构数据,支持多国语言版本
- 发布一个http请求封装类
- 怎么看电脑电源多少w_UPS不间断电源设备哪个品牌好?如何选购家用电脑UPS电源?UPS电源价格多少?...
- realme Race新旗舰入网:旗下首款骁龙888旗舰
- html 前端传入后台为object_浅谈Object.defineProperty()
- 杀死提交的hadoop任务
- 函数glDefinePopup(),动态定义多级的popup菜单
- TeamViewer 13界面功能介绍
- Java编程练习题4
- 基于HMM的拼音输入法
- Python编程快速上手——让繁琐工作自动化第8章8.9.2:疯狂填词
- python制作简单网页_怎么用python简单的制作一个网页
- 爱看小说手机网源码全站带3w数据带采集,ThinkPHP内核小说网站源码带听书等全部插件
- ftp服务器文件复制文件路径,FTP将文件复制到同一FTP的另一个位置
- infor系统日常问题解决笔记
- C++常成员函数 常对象成员
- mac安装sql server
热门文章
- 我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛
- 从uptime、stress、mpstat、pidstat观察CPU密集型、IO密集型、进程密集型切换的系统性能
- getdate函数_PHP getdate()函数与示例
- java 方法 示例_Java扫描器具有示例的NextNextShort()方法
- 集合——对象数组(引用数据类型数组)
- java 基础实战_Java基础实战(三)
- VisualStudio2019配置OpenCV
- StringTokenizer将一个字符串分解为单词或者标记
- usb转ttl_[开源]双TYPEC转TTL串口模块
- Centos7忘记密码——转