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)

大家都在看

  • 搭建zabbix 4.0

    安装zabbix的依赖包 下载zabbix源码包 数据库导入数据的命令格式:mysql ­u用户名 ­p密码 数据库名称 < 要导入的数据 此时的路径是在databases/…

    Linux 2023年6月8日
    0109
  • NAT回流(Twice NAT)Hairping 参数详解

    内网用户需要通过域名访问内网的服务器,一般商用环境是无法访问的,需要经过以下配置,原理不说了,直接说配置。 nat (inside,inside) source dynamic i…

    Linux 2023年6月6日
    098
  • shell之文件路径截取

    最近写脚本,需要对脚本中函数传递的路径参数进行截取,发现了以下比较好用的方法,记录下: file=/dir1/dir2/dir3/my.file.txt 我们可以用${ }分别替换…

    Linux 2023年5月28日
    080
  • nginx禁止直接ip、未配置域名访问配置

    问题背景 最近偶然对线上域名配置的nginx IP进行直接访问后,发现http居然是可以通的,而https直接IP访问浏览器会报证书不安全的提示,点击详细查看发现是固定返回了ngi…

    Linux 2023年6月6日
    0206
  • Python List 中的append 和 extend 的区别

    方法的参数不同 append 方法是向原list的末尾添加一个对象(任意对象;如元组,字典,列表等),且只占据一个原list的索引位,添加后无返回值,直接在原列表中添加。 list…

    Linux 2023年6月7日
    084
  • 5.9 Linux Vim批量注释和自定义注释

    使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符 #再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完…

    Linux 2023年6月7日
    087
  • ADO.NET学习

    ADO.NET五大常用对象 一,SqlConnection(连接对象) 1,配置文件 2,看个例子吧 二,Command对象 执行查SQL查询方法或者PROC返回一个数据库表格, …

    Linux 2023年6月7日
    079
  • OSPF之Default-router-advertise 解析

    1、关于default-route-advertise命令 Ospf是可以通过import-route命令引入外部路由的,但很少有人会注意到,在默认情况下,ospf是不会引入来自外…

    Linux 2023年6月14日
    094
  • ELK 脚本自动化删除索引

    kibana有自带接口,可通过自带的API接口 通过传参来达到删除索引的目的。 删除15天前的索引 curl -XDELETE "http://10.228.81.161…

    Linux 2023年6月8日
    071
  • Linux常用文件权限命令详解

    pwd pwd命令用于获取当前工作目录的绝对路径。 使用示例: pwd 效果如下图: cd cd命令用于切换工作目录。 使用示例: cd &#x4E07;&#x73…

    Linux 2023年5月27日
    0100
  • [20210930]bbed读取数据块7 fffext.sh.txt

    [20210930]bbed读取数据块7 fffext.sh.txt –//一般bash shell脚本很少考虑执行效率,仅仅考虑利用它快速解决工作中遇到的问题. &#…

    Linux 2023年6月13日
    083
  • R语言-tidyr和dplyr

    一、安装和加载 1、安装并加载tidyr和dplyr包 install.packages("tidyr") library(tidyr) install.pac…

    Linux 2023年6月8日
    087
  • Linux用户和用户组

    Linux用户和用户组 1.添加新的用户 (用户ID从500开始,0-99系统管理级别、100-499系统预留) useradd 选项 用户名 参数说明 选项: -c commen…

    Linux 2023年6月11日
    088
  • NewReplacer使用技巧

    上次写博客至今有段时间了,这些日子,认真过,努力过,职场中不管有哪些让人失意或不快的事,终归到底,是自己不够强大。。。 好吧,新的一年,不磨磨唧唧了,一般处理xss漏洞使用正则匹配…

    Linux 2023年6月6日
    090
  • 【Example】C++ 虚基类与虚继承 (菱形继承问题)

    C++ 是支持多继承的语言, 但是实际项目开发中非必要不要使用多继承以降低代码逻辑的复杂性,当然 C++ 多继承的特性带来一些问题即 菱形继承。 当一个类继承了两个来自同父类的子类…

    Linux 2023年6月13日
    073
  • MongoDB安装使用教程

    MongoDB安装使用教程 介绍 MongoDB是一个基于分布式文件存储的数据库,是一个文档数据库,支持的数据结构非常松散,是类似json的bson格式,可以存储比较复杂的数据类型…

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