C++是一门与时俱进的语言。 早期的C++关注的主要问题是通用性,却没有太多关注易用性的问题,使得C++成为了一门多范式语言,但是使用门槛较高。

  从2011开始,C++的标准进行了较大的更新,开始更多地关注易用性。通常,2011年的C++标准称为C++11,又称为C++0X。目前,C++的标准基本上每三年更新一次,因此有了2014的C++14,以及今年即将发布C++17标准。如果继续是三年发布一个标准,可以预期,在2020会有C++20标准。目前GCC 6.1开始已经默认默认使用 C++14 标准。

  现代C++的详细内容请参考维基百科或者http://en.cppreference.com或者MSDN的介绍:欢迎回到 C++(现代 C++)

  本篇将举一个简单的例子,通过四个特性,说明现代C++的魅力。如下:

 #include <iostream>
#include <vector>
#include <utility> using namespace std;
int main()
{
//1.`Range For` And `Auto` (since C++11)
char str[] = "hello";
for (auto ch : str)cout << ch;
cout << endl; //2.`using` for `type alias` (since C++11)
using vecint = vector<int>;
vecint ivec;
for (auto ele : { ,, })ivec.push_back(ele);
for (auto ele : ivec)cout << ele << endl; //3.Generalized lambda (since C++14)
auto f = [](auto x, auto y) {return x + y; };
auto g = [](auto func, auto z) {return func(, z) + ; };
auto apply = [](auto func, auto ele) {return func(ele); };
auto square = [](auto ele) {return ele*ele; };
cout << f(, ) << endl;
cout << g(f, ) << endl;
auto s = f(string("hello"), string(" world"));
//cout << s << endl;
cout << s.c_str() << endl; //MSVC error for `s`
cout << apply(square, 8.1) << endl; //4.Structured binding declaration (since C++17)
auto a = "hello";
auto b = "world";
auto swap = [](auto x, auto y) {return make_pair(y, x); };
auto [c, d] = swap(a, b);
cout << c << endl << d << endl;
}

  编译: $ g++ -std=c++ main.cpp

  输出:

$ ./a
hello hello world
65.61

涉及的四个特性

  1.Range-based for loop (since C++11)

  基于范围的for循环在很多语言早就有了,比如Python,Java1.5+。这是一个易用特性。

  2.'using'关键字用于别名 (since C++11)

  using增加了新用法,算是老词新意,用于简化过长的类型声明,目前Java依然没有这个特性。

  3.Generalized lambda (since C++14)

  泛型Lambda,有一点类似C++中模版,在这里比模版简洁。

  4.Structured binding (since C++17)

  结构化绑定声明,是指在一次声明中同时引入多个变量,同时绑定初始化表达式的各个子对象的语法形式。

小结:

  这个例子给我的感觉是,如果连auto都可以省略掉的话,这语法基本上就类似Python了。这也说明,C++开始吸收其他语言的优点,成为一门越来越现代化的语言。目前,越来越多的新项目开始使用C++的新特性。为了避免落后,我们有必要重新认识C++。

C++学习(一):现代C++尝试的更多相关文章

  1. 学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型

    Conference业务简介 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的用户有两类: 1:客户,可以创建和管理会议. 2:会议座位预定者,可以预订会 ...

  2. WMS学习笔记:1.尝试加载WMS

    1.首先找一个可用的WMS栅格地图服务:http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi 获取GetCapabilities: http://de ...

  3. Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)

    摘要 卷积网络在特征分层领域是非常强大的视觉模型.我们证明了经过端到端.像素到像素训练的卷积网络超过语义分割中最先进的技术.我们的核心观点是建立"全卷积"网络,输入任意尺寸,经过有 ...

  4. Spring Security笔记:登录尝试次数限制

    今天在前面一节的基础之上,再增加一点新内容,默认情况下Spring Security不会对登录错误的尝试次数做限制,也就是说允许暴力尝试,这显然不够安全,下面的内容将带着大家一起学习如何限制登录尝试次 ...

  5. 20145212 《Java程序设计》第5周学习总结

    20145212 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做处理. try{ . ...

  6. paper 53 :深度学习(转载)

    转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...

  7. wpf依赖属性、绑定实现原理、附加属性学习

    依赖属性和普通属性相比节省内存的原因:对于普通属性,每个对象有需要存储一个普通属性的值,即便是默认值.而依赖属性的默认值是静态的存储在类中的,所有对象都使用同一默认值,所以对于拥有大量属性的控件来说这 ...

  8. 新手学习 Vim 的五个技巧

    多年来,我一直想学 Vim.如今 Vim 是我最喜欢的 Linux 文本编辑器,也是开发者和系统管理者最喜爱的开源工具.我说的学习,指的是真正意义上的学习.想要精通确实很难,所以我只想要达到熟练的水平 ...

  9. SharePoint 学习记事(一)

    记录背景: 随着公司业务的拓展,为拿到更多的项目,让原本不太信任我们的美国大佬相信我们的实力,让在美国的销售发挥他的能力,所以公司在13年下半年筹划收购了一家美国本土的公司.大约400人的规模,这个公 ...

  10. 初次踏上GUI编程之路(有点意思,详细介绍了菜鸟的学习之路)

    初次踏上GUI编程之路 —— 我的Qt学习方法及对Qt认识的不断转变 -> 开始接触GUI与开始接触Qt: 话说,我第一次看见“Qt”这一个名词,好像是在CSDN网站的主页上吧,因为CSDN好像 ...

随机推荐

  1. 【linux】CPU,内存对网站的影响

    如果读写非常多,建议内存大点 如果涉及到的计算非常多,那就升级CPU

  2. Python文件与异常处理

    文件读写 使用python的BIF(build in function)open()进行文件读写操作 # 1.打开文件 data = open(file_name,'w') # 读取模式有很多种,主要 ...

  3. Kali 网络配置

    一.配置IP 编辑/etc/network/interfaces # This file describes the network interfaces available on your syst ...

  4. 自己用C语言写RH850 F1KM serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 手上有块Renesas ...

  5. 03017_ajax

    1.Ajax概述 (1)什么是同步,什么是异步? ①同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态: ②异步现象:客户端发送请求到服务器端,无论服务器是否返回响应, ...

  6. leetcode 【 Subsets II 】python 实现

    题目: Given a collection of integers that might contain duplicates, S, return all possible subsets. No ...

  7. MYSQL学习心得(转)

    适合有SQL SERVER或ORACLE基础的人看,有对比,学习更有效果 转自:http://www.cnblogs.com/lyhabc/ 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习 ...

  8. Monkeyrunner 录制脚本&回放

    本文主要解释如何使用monkeyrunner来实现脚本的录制和回放 一:准备条件 在电脑端配置 Android SDK环境   java 环境 下载好 SDK后添加环境变量   E:\android- ...

  9. PageObject模式简介

    一.原理 将页面元素定位和对元素的操作行为封装成一个page类,实现对页面对象和测试用例的分离. 一条测试用例可能需要多个步骤操作元素,将每个步骤单独的封装成一个方法,在执行测试用例的时候调用封装好的 ...

  10. Mac 如何删除应用、软件

    首先需要跟刚接触Mac的小白分享一下卸载软件常用的两种方法: 1.点击Finder(访达)—应用程序—选择所要删除的软件—拖拽到右下方的废纸篓或者单击右键选择“移除到废纸篓”. 2.打开Launchp ...