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 是一个操作符,其可以评估括号内表达式的类型,其规则如下:

  1. 如果表达式e是一个变量,那么就是这个变量的类型。
  2. 如果表达式e是一个函数,那么就是这个函数返回值的类型。
  3. 如果不符合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;
4.auto 和 decltype 的差别和关系

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 是右值
}
如果auto 和 decltype 在一起使用会是什么样子?能看下面的示例,下面这个示例也是引入decltype的一个原因——让C++有能力写一个 “ forwarding
function 模板”,
template< typename LHS, typename RHS>
  auto AddingFunc(const LHS &lhs, const RHS &rhs) -> decltype(lhs+rhs)
{return lhs + rhs;}

这个函数模板看起来相当费解,其用到了auto 和 decltype
来扩展了已有的模板技术的不足。怎么个不足呢?在上例中,我不知道AddingFunc会接收什么样类型的对象,这两个对象的 +
操作符返回的类型也不知道,老的模板函数无法定义AddingFunc返回值和这两个对象相加后的返回值匹配,所以,你可以使用上述的这种定义。

5.统一的初始化语法

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】相关推荐

  1. C语言程序设计作业07:第十六周作业

    | 这个作业属于哪个课程 C语言程序设计II 我在这个课程的目标是 了解并精通C语言 这个作业在那个具体方面帮助我实现目标 了解函数的编译和构造,认识有些已有的库函数 -参考文献- -C语言程序设计教 ...

  2. C语言程序设计作业07

    这个作业要求在哪里 掌握结构 我在这个课程的目标是 灵活使用结构 这个作业在那个具体方面帮助我实现目标 结构 参考文献 百度,CSDN 1.1节约有理 1.1.1数据处理 1.1.2实验代码截图 1. ...

  3. 吉林大学超星MOOC高级语言程序设计 实验07(2021级)

    1. (程序题) [计2016级期末试题]构造一个表示教师的结构体(包含3个字段:姓名.性别.年龄),编写函数,读入n个教师的信息,存入一个结构体数组中(如下图所示).最后输出第n/2个教师的信息. ...

  4. 吉林大学 超星慕课 高级语言程序设计 实验07 递归程序设计(2022级)

    本人能力有限,发出只为帮助有需要的人. 建议同学们自己写完后再进行讨论. 1.题目名称:排列组合 问题描述:编写程序求函数C(m,n)的值. 输入:从键盘随机输入一个自然数和一个非负整数,分别作为m和 ...

  5. 河南工业大学2017“玲珑杯”程序设计竞赛 07

    1266: 最大子段和 时间限制: 1 秒  内存限制: 64 MB 提交: 276  解决: 55 提交 状态 题目描述 一个大小为n的数组a1到an(−10^4≤ai≤10^4).请你找出一个连续 ...

  6. c sharp 语言,C Sharp 语言Windows程序设计.ppt

    C Sharp 语言Windows程序设计 2010.07 第5章 Windows窗体与控件程序设计 学习要点 1.理解并掌握解决方案的创建及其项目管理 2.熟练掌握窗体的创建方法及其程序设计 3.理 ...

  7. C/C++程序设计题[2023-05-27]

    C/C++程序设计题[2023-05-27] 程序设计题01:媒体信息统计系统 1 问题描述 该系统要求实现一个简单.实用的媒体信息统计程序,主要功能包括媒体信息数据的新增.删除.修改.查找.统计输出 ...

  8. 人工智能专业基础课程

    计算机系统基础(一):程序的表示.转换与链接 课程大纲 01      第一周 计算机系统概述     课时     第1讲 为什么要学习计算机系统基础   第2讲 计算机系统基本组成与基本功能   ...

  9. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  10. 《面向对象程序设计》第07章在线测试

    <面向对象程序设计>第07章在线测试  <面向对象程序设计>第07章在线测试 剩余时间: 59:56  答题须知:1.本卷满分20分.            2.答完题后,请一 ...

最新文章

  1. c/c++ 获取文件夹或目录下的文件
  2. 内存延时cl_内存频率和CL延迟哪个重要
  3. 给定某年日期及该年第一天是星期几然后显示该年的日历
  4. 个人永久性免费-Excel催化剂功能第119波-一大波虚构数据,支持多国语言版本
  5. 发布一个http请求封装类
  6. 怎么看电脑电源多少w_UPS不间断电源设备哪个品牌好?如何选购家用电脑UPS电源?UPS电源价格多少?...
  7. realme Race新旗舰入网:旗下首款骁龙888旗舰
  8. html 前端传入后台为object_浅谈Object.defineProperty()
  9. 杀死提交的hadoop任务
  10. 函数glDefinePopup(),动态定义多级的popup菜单
  11. TeamViewer 13界面功能介绍
  12. Java编程练习题4
  13. 基于HMM的拼音输入法
  14. Python编程快速上手——让繁琐工作自动化第8章8.9.2:疯狂填词
  15. python制作简单网页_怎么用python简单的制作一个网页
  16. 爱看小说手机网源码全站带3w数据带采集,ThinkPHP内核小说网站源码带听书等全部插件
  17. ftp服务器文件复制文件路径,FTP将文件复制到同一FTP的另一个位置
  18. infor系统日常问题解决笔记
  19. C++常成员函数 常对象成员
  20. mac安装sql server

热门文章

  1. 我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛
  2. 从uptime、stress、mpstat、pidstat观察CPU密集型、IO密集型、进程密集型切换的系统性能
  3. getdate函数_PHP getdate()函数与示例
  4. java 方法 示例_Java扫描器具有示例的NextNextShort()方法
  5. 集合——对象数组(引用数据类型数组)
  6. java 基础实战_Java基础实战(三)
  7. VisualStudio2019配置OpenCV
  8. StringTokenizer将一个字符串分解为单词或者标记
  9. usb转ttl_[开源]双TYPEC转TTL串口模块
  10. Centos7忘记密码——转