zoukankan      html  css  js  c++  java
  • C++学习(一):现代C++尝试

      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++的魅力。如下:

     1 #include <iostream>
     2 #include <vector>
     3 #include <utility>
     4 
     5 using namespace std;
     6 int main()
     7 {
     8     //1.`Range For` And `Auto` (since C++11)
     9     char str[] = "hello";
    10     for (auto ch : str)cout << ch;
    11     cout << endl;
    12 
    13     //2.`using` for `type alias` (since C++11)
    14     using vecint = vector<int>;
    15     vecint ivec;
    16     for (auto ele : { 1,2,3 })ivec.push_back(ele);
    17     for (auto ele : ivec)cout << ele << endl;
    18 
    19     //3.Generalized lambda (since C++14)
    20     auto f = [](auto x, auto y) {return x + y; };
    21     auto g = [](auto func, auto z) {return func(3, z) + 4; };
    22     auto apply = [](auto func, auto ele) {return func(ele); };
    23     auto square = [](auto ele) {return ele*ele; };
    24     cout << f(2, 3) << endl;
    25     cout << g(f, 5) << endl;
    26     auto s = f(string("hello"), string(" world"));
    27     //cout << s << endl;
    28     cout << s.c_str() << endl; //MSVC error for `s`
    29     cout << apply(square, 8.1) << endl;
    30 
    31     //4.Structured binding declaration (since C++17)
    32     auto a = "hello";
    33     auto b = "world";
    34     auto swap = [](auto x, auto y) {return make_pair(y, x); };
    35     auto [c, d] = swap(a, b);
    36     cout << c << endl << d << endl;
    37 }

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

      输出:

    $ ./a
    hello
    1
    2
    3
    5
    12
    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++。

  • 相关阅读:
    ios-点击图片放大,背景变半透明
    为代码分段标识
    方法的标签_With携带
    使用json要导入什么包
    Json中不支持任何形式的注释,那我们要怎么解决呢
    JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了。
    JFinal上传文件时用getFile()方法报错
    JFinal文件上传时直接使用getPara()去接受表单的数据接收到的数据一直是null?
    Freemarker全部文档和具体实例
    Eclipse安装Freemarker插件
  • 原文地址:https://www.cnblogs.com/wurui1994/p/6308646.html
Copyright © 2011-2022 走看看