C++11

1.新增不需要赋值即可初始化

//C++98
    int a = 1;
    int* p1 = new int[3];
    Date d1(2022, 9, 26);

    //C++11
    Date d2{ 2022,9,27 };
    int* p2 = new int[3]{ 1,2,3 };
    int b{ 1 };
    Date* p4 = new Date[3]{ {2022,9,28},{2022,9,29},{2022,9,30} };

2.右值引用

1.左值引用 只能引用左值,不能引用右值

const 左值 可以引用左值,也可以引用右值

//左值引用
    int c = 1;
    int& rc = c;
    //int& rv = 20;  ×  左值不允许引用右值
    const int& rv = 20;//因为20是常量  关乎到权限的问题 所以可以引用
    const int& rb = c;

2.右值引用

//右值引用
    int&& r1 = 10;
    //int&& r2 = c; 右值引用不允许引用左值
    int&& rb = move(c);//move能把左值该为右值  但是他的数据会被转移 所以谨慎使用
string s1("111");
    string s2 = (move(s1));
    //s1 的111被move转移到了s2  所以现在s1为空

两者的差别在与 坐值引用可以取地址 右值引用不可以取地址

3.可变模版参数

// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
template <class ...Args>
void ShowList(Args... args)
{}

4.lambda表达式

//lambda表达式
    int d = 1;
    int e = 2;

    auto add1 = [](int a, int b)->int {return a + b; };
    add1(1, 2);

    auto add2=[](int a, int b){return a + b; };
    add2(1, 2);

    auto add3 = [=] {return d + e; };//全部传值
    //auto add3=[=]{return d=e;};
    //传值 不允许被修改
    add3();
    auto add4 = [&] {return d = e + 2; };//全部传引用
    add4();
    auto add5 = [&, d] {return e = d + 2; };//d用传值 其他全部传引用
    add5();
    auto add6 = [=, &d] {return d = e + 2; };//d用传引用 其他全部传值
    add6();

5.包装器

    //包装器
    function<int(int, int)> fun1 = f;
    fun1(1, 2);
    function<int(int, int)> fun2 = person::a;//调用静态成员函数
    fun2(1, 2);
    function<int(person,int, int)> fun3 = &person::b;//调用普通成员函数
    fun3(person(), 1, 2);

150. 逆波兰表达式求值 – 力扣(LeetCode)

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
    stack<long long> s;
    map<string,function<long long(long long,long long)>> func=
    {
        {"+",[](long long a,long long b){return a+b;}},
        {"-",[](long long a,long long b){return a-b;}},
        {"*",[](long long a,long long b){return a*b;}},
        {"/",[](long long a,long long b){return a/b;}}
    };

    for(auto& e:tokens)
    {
        if(func.count(e))//判断e是否存在map中  存在就是操作符
        {
            long long right=s.top();
            s.pop();
            long long left=s.top();
            s.pop();

            s.push(func[e](left,right));
        }
        else//不存在就是操作数
        {
            s.push(stoll(e));
        }
    }
    return s.top();
    }
};

6.bind

    //bind
    function<int(int, int)> fun1 = bind(f,placeholders::_2,placeholders::_1);
    fun1(1, 2);//bind调整顺序
    function<int(int, int)> fun2 = person::a;//调用静态成员函数
    fun2(1, 2);
    function<int(person, int, int)> fun3 = &person::b;//调用普通成员函数  //不用bind时 function参数要加person
    fun3(person(), 1, 2);
    function<int(int, int)> fun4 = std::bind(&person::b,person(),placeholders::_1, placeholders::_2); //调用普通成员函数   用bind时 function参数不用加person
    fun4(1, 2);//bind调整参数个数

7.整体代码

#include
#include
using namespace std;

class Date
{
public:
    Date(int y, int m, int d)
    {
        year = y;
        month = m;
        day = d;
    }

private:
    int year;
    int month;
    int day;
};

template<class T>
void a(T&& t)//传左值变左值 传右值变左值
{
    func(t);//这时候的t已经是左值了
    //因为被模版折叠
    //但可以move改变为右值
    func(move(t));//但t的资源会被转移
    func(forward(t));//完美转发 转为右值 并且t的资源不会被转移
}

class person
{
    //person() = default;
    //强制生存默认构造或者其他的拷贝赋值等...

    //person() = delete;
    //不让调用并且不让生存默认构造或者其他的拷贝赋值等...

public:

    static int a(int a, int b)
    {
        return a + b;
    }

    int b(int a, int b)
    {
        return a + b;
    }

};

// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
template <class ...Args>
void ShowList(Args... args)
{}

int f(int a,int b)
{
    return a + b;
}

int main()
{
    //C++98
    int a = 1;
    int* p1 = new int[3];
    Date d1(2022, 9, 26);

    //C++11
    Date d2{ 2022,9,27 };
    int* p2 = new int[3]{ 1,2,3 };
    int b{ 1 };
    Date* p4 = new Date[3]{ {2022,9,28},{2022,9,29},{2022,9,30} };

    //左值引用
    int c = 1;
    int& rc = c;
    //int& rv = 20;  ×  左值不允许引用右值
    const int& rv = 20;//因为20是常量  关乎到权限的问题 所以可以引用
    const int& rb = c;

    //右值引用
    int&& r1 = 10;
    //int&& r2 = c; 右值引用不允许引用左值
    int&& rb = move(c);//move能把左值该为右值  但是他的数据会被转移 所以谨慎使用

    string s1("111");
    string s2 = (move(s1));
    //s1 的111被move转移到了s2  所以现在s1为空

    //lambda表达式
    int d = 1;
    int e = 2;

    auto add1 = [](int a, int b)->int {return a + b; };
    add1(1, 2);

    auto add2=[](int a, int b){return a + b; };
    add2(1, 2);

    auto add3 = [=] {return d + e; };//全部传值
    //auto add3=[=]{return d=e;};
    //传值 不允许被修改
    add3();
    auto add4 = [&] {return d = e + 2; };//全部传引用
    add4();
    auto add5 = [&, d] {return e = d + 2; };//d用传值 其他全部传引用
    add5();
    auto add6 = [=, &d] {return d = e + 2; };//d用传引用 其他全部传值
    add6();

    //包装器
    function<int(int, int)> fun1 = f;
    fun1(1, 2);
    function<int(int, int)> fun2 = person::a;//调用静态成员函数
    fun2(1, 2);
    function<int(person,int, int)> fun3 = &person::b;//调用普通成员函数
    fun3(person(), 1, 2);

    //bind
    function<int(int, int)> fun1 = bind(f,placeholders::_2,placeholders::_1);
    fun1(1, 2);//bind调整顺序
    function<int(int, int)> fun2 = person::a;//调用静态成员函数
    fun2(1, 2);
    function<int(person, int, int)> fun3 = &person::b;//调用普通成员函数  //不用bind时 function参数要加person
    fun3(person(), 1, 2);
    function<int(int, int)> fun4 = std::bind(&person::b,person(),placeholders::_1, placeholders::_2); //调用普通成员函数   用bind时 function参数不用加person
    fun4(1, 2);//bind调整参数个数

    return 0;
}

Original: https://www.cnblogs.com/LonelyMoNan/p/16732360.html
Author: lemon-Breeze
Title: C++11

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606468/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • jenkins

    1. jenkins简介 1.1 SVN介绍 1.2 Maven介绍 1.3 Ant介绍 1.4 Gitdle介绍 1.5 jenkins工作原理 1.6 jenkins特点 2….

    Linux 2023年6月13日
    0148
  • 大数据——综合案例

    一、本地数据集上传到到数据仓库Hive 1、 实验数据集的下载 将user.zip下载到指定目录 2.给hadoop用户赋予针对bigdatacase目录的各种操作权限 3.创建一…

    Linux 2023年6月6日
    092
  • Jenkins

    Jenkins Jenkins jenkins简介 jenkins工作原理 jenkins特点 CI/CD是什么 使用tomcat容器安装jenkins jenkins流水线项目发…

    Linux 2023年6月6日
    0126
  • QT获取linux下的当前用户名

    故事背景:客户端启动的时候需要加载机器/home/xx/test.jpg的图片作为背景图,但是有的机器用户名叫AAA,有的机器名叫BBB,所以我需要获取当前用户的home目录 技术…

    Linux 2023年6月13日
    0113
  • python 多线程

    python 多线程 多线程流程 导入模块 import threading 通过线程类型创建线程对象 &#x7EBF;&#x7A0B;&#x5BF9;&a…

    Linux 2023年6月13日
    081
  • 【电子取证:FTK Imager篇】DD、E01系统镜像仿真

    星河滚烫,人生有理想!​—【suy999】 一、DD、E01系统镜像动态仿真 在电子取证分析过程中,我们经常遇到DD、E01等系统镜像,然而,并非所有工作者手边都有自动…

    Linux 2023年6月13日
    0112
  • 计算机网络通信

    早期:联机 以太网:局域网与交换机 广播 主机之间”一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息…

    Linux 2023年6月14日
    099
  • 拓扑排序

    拓扑排序 简介 拓扑排序是将偏序的数据线性化的一种排序方法。复习下偏序和全序的概念: 全序关系是偏序关系的一个子集。 全序是集合内任何一对元素都是可比较的,比如数轴上的点都具有一个…

    Linux 2023年6月13日
    0118
  • sql server 增删改(查太多了)

    delete(删除) 使用 delete语句删除表中数据。 delete from 表名 [where where_definition] 如果不使用where子句,将删除表中所有…

    Linux 2023年6月7日
    087
  • jenkins使用ssh remote插件执行shell后无法退出的问题处理

    现象:通过jenkins发布代码后,执行远程命令,一直卡在执行远程命令那里打转,无法退出 脚本 #!/bin/bash 根据参数,执行进程的启动 停止 重启等 #source /e…

    Linux 2023年5月28日
    098
  • Spring cloud gateway 如何在路由时进行负载均衡

    本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: 其中lb表示采用了负载均衡,user-server表示服…

    Linux 2023年6月14日
    090
  • (转)WEB页面导出为Word文档后分页&横向打印的方法

    WEB页面导出为Word文档后分页&横向打印的方法title >HEAD >/// * * @param {Object} cont 要导出的html元素内容的…

    Linux 2023年6月7日
    0127
  • 由乐观锁延伸出的知识

    锁是网络数据库中的一个非常重要的概念,当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性以商场的试衣间为例,每个试衣间都…

    Linux 2023年6月7日
    083
  • 来的随笔

    感谢各位 posted @2022-01-07 12:08 三途河畔人 阅读(71 ) 评论() 编辑 Original: https://www.cnblogs.com/sthp…

    Linux 2023年6月7日
    0115
  • 性能测试 CPU利用率低 响应时间长的瓶颈分析

    压测中Vuser增加,TPS上不去,意味着Response Time在增加,需要找出响应时间增加的原因: 1、网络带宽 在压力测试中,有时候要模拟大量的用户请求,如果单位时间内传递…

    Linux 2023年6月8日
    071
  • python递归查找文件目录

    1 # -*- coding:utf-8 -*- 2 3 import os 4 5 allfile = [] 6 def get_all_file(path): 7   allf…

    Linux 2023年6月6日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球