现代C++ 11

笔记来源:

c++11新特性,所有知识点都在这了!

类型推导

auto

让编译器在编译期就推导出变量的类型,可以通过=右边的类型推导出变量的类型。

    auto test=10;
    cout<<typeid(test).name()<<endl;// int

decltype

decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算

    int x = 0;
    decltype(x) y;// 分析x的类型,并构建变量y
    decltype(x + y) z;// 分析x+y的类型,并构建变量z
    cout<<typeid(z).name()<<endl;// int
    int func() { return 0; }
    
    decltype(func) f;// 分析func方法返回的类型,并构建变量f
    cout<<typeid(f).name()<<endl;// int

左值右值

  1. 左值:可以取地址并且有名字的东西就是左值。
  2. 右值:不能取地址的没有名字的东西就是右值。

例如:

int a;
a=0;

这里面a就是左值,0是右值。

  1. 纯右值:运算表达式产生的临时变量、不和对象关联的原始字面量、非引用返回的临时变量、lambda表达式等。
  2. 将亡值:可以理解为即将要销毁的值。
  3. 左值引用:对左值进行引用的类型。
  4. 右值引用:对右值进行引用的类型。
  5. 移动语义:转移资源所有权,类似于转让或者资源窃取的意思,对于那块资源,转为自己所拥有,别人不再拥有也不会再使用。
  6. 完美转发:可以写一个接受任意实参的函数模板,并转发到其它函数,目标函数会收到与转发函数完全相同的实参。
  7. 返回值优化:当函数需要返回一个对象实例时候,就会创建一个临时对象并通过复制构造函数将目标对象复制到临时对象,这里有复制构造函数和析构函数会被多余的调用到,有代价,而通过返回值优化,C++标准允许省略调用这些复制构造函数。

列表初始化

在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化

     int num(50);
    std::cout<<num<<std::endl;//50

    int list[5]={0,1,2,3,4};
    for(int i=0;i<5;i++)
        std::cout<<list[i];//01234

std::function

std::function是一个函数包装器,
该函数包装器模板能包装任何类型的可调用实体,
如普通函数,函数对象,lamda表达式等。包装器可拷贝,移动等,
并且包装器类型仅仅依赖于调用特征,而不依赖于可调用元素自身的类型。
std::function是C++11的新特性,包含在头文件<functional>中。

就是C语言中的函数指针

#include <iostream>
#include <functional>
using namespace std;
void print()
{
    cout<<"hello"<<endl;
}
int main()
{
    std::function<void()> func(&print);
    func();// hello
    return 0;
}

std::bind

bind这个方法有点抽象,

std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作。
————————————————
版权声明:本文为CSDN博主「___Blue_H」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37653144/article/details/79285221

例如

#include <iostream>
#include <typeinfo>
#include <functional>
using namespace std;
void mprint(const char * str,const char * str2)
{
    cout<<str<<str2<<endl;
}
int main()
{
    auto func = std::bind(mprint, "hello",std::placeholders::_1);
    func(" world");//hello world
    return 0;
}

本来需要两个参数的mprint方法,变成了只需要1个参数。
std::placeholders::_1是占位符,用于表示第一个参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚拟内存会梦见进程调度嘛?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值