浙江网站建设哪家最好,国内机械加工企业排名,动易与php环境架设网站,庭院景观设计#x1f44d;作者主页#xff1a;进击的1 #x1f929; 专栏链接#xff1a;【1的C进阶】 文章目录 一#xff0c;类的新变化二#xff0c;可变参数模板三#xff0c;lambda表达式 一#xff0c;类的新变化 
在C03之前#xff0c;我们的默认成员函数有6个#xff0c;… 作者主页进击的1  专栏链接【1的C进阶】 文章目录 一类的新变化二可变参数模板三lambda表达式 一类的新变化 
在C03之前我们的默认成员函数有6个我们在类与对象这篇中有过详细的讲解。C11中又增加了两个默认成员函数—移动构造与移动赋值重载其底层原理以及优势我们在上节已经有过描述。但是针对这两个默认成员函数我们还需要注意以下说明 
如果你没有实现移动构造函数并且也没有实现析构函数拷贝构造拷贝赋值重载中的任意一个那么编译器将会生成一个默认的移动构造函数默认生成的移动构造对于内置类型成员会进行逐字节的拷贝对于自定义类型成员则需要看这个成员是否实现移动构造如果实现了就调用移动构造没有实现就调用拷贝构造。移动赋值重载与移动构造此种情况类似。如果你提供了移动构造或者移动赋值重载那么编译器将不会再提供拷贝构造和拷贝赋值重载。 
我们以以下代码为例 
class string{public:string(const char* str  ):_str(nullptr){cout  string(const char* str)  endl;}//拷贝构造string(const string s):_str(nullptr){string tmp(s._str);std::swap(_str, tmp._str);//....cout  string(const string s)  endl;}//移动构造string(string s){std::swap(s._str, _str);cout  string(string s)  endl;}//赋值重载string operator(string s){std::swap(s._str, _str);cout  string operator(string s)  endl;return *this;}//移动赋值string operator(string s){std::swap(s._str, _str);return *this;}private:char* _str;};templateclass Tclass A{public:A(T s):_a(0),_s(std::forwardT(s)){cout  A  endl;}A(T s):_a(0), _s(s){cout  A  endl;}private:int _a;T _s;};void test1(){hyp::string s2  (234);Astring a3(s2);Astring a4(move(a3));}通过上述结果我们可以发现对于自定义成员其在没有自己实现析构函数拷贝构造赋值重载时会自动调用自定义成员的移动构造。 当我们在类A中自己实现析构函数拷贝构造赋值重载任意一个时结果如下  其就不再自动调用自定义类型成员的移动构造而是调用拷贝构造。  当我们添加A的移动构造后编译器便不会再生成拷贝构造和赋值重载而且我们也没有写编译器便会报错。 
C11允许在类定义时给成员变量初始缺省值默认生成构造函数会使用这些缺省值初始化。 
强制生成默认函数的关键字default:  当有了移动构造后便不会再生成拷贝构造因此我们可以使用default当强制生成拷贝构造。 
禁止生成默认函数的关键字delete: 
二可变参数模板 
C11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板相比C98/03类模版和函数模版中只能含固定数量的模版参数可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象使用起来需要一定的技巧。 我们在这里只进行简单的了解下面我将演示两种能够获取到参数包中参数的方法。 
方法一—递归 
templateclass T
void Showlist(const T val)//递归终止条件
{cout  val  endl;
}templateclass T,class ...Args
void Showlist(T val, Args... args)
{cout  val   ;Showlist(args...);}方法二–逗号表达式 
templateclass T
void printargs(T t)
{cout  t   ;
}templateclass ...Args
void Getargs(Args ...args)
{int arr[]  { (printargs(args),0)... };
} 三lambda表达式 
为什么要有lambda表达式 假设我们现在需要对一个集合进行排序我们用std::sort进行排序当我们要排升序时则需要传一个升序规则的仿函数要降序时则传一个降序规则的仿函数当要元素类型不同时则又需要该这个仿函数。比较麻烦而lambda表达式可以避免这个麻烦因此在C11中就有了lambda表达式的出现。 
lambda表达式的格式 [捕捉列表] (参数列表) mutable - 返回值类型 { 函数体}。 
捕捉列表 该列表总是出现在lambda函数的开始位置编译器根据[]来判断接下来的代码是否为lambda函数捕捉列表能够捕捉上下文中的变量供lambda函数使用。 参数列表 与普通函数的参数列表一致如果不需要参数传递则可以 连同()一起省略。 mutable 默认情况下lambda函数总是一个const函数mutable可以取消其常量性。使用该修饰符时参数列表不可省略(即使参数为空)。 返回值类型 用追踪返回类型形式声明函数的返回值类型没有返回值时此部分可省略。返回值类型明确情况下也可省略由编译器对返回类型进行推导。 函数体 在该函数体内除了可以使用其参数外还可以使用所有捕获 到的变量。 
我们来小总结一下在lambda表达式中参数列表返回值类型,mutable是可以选择的。因此我们就有了一个最简单的lambda表达式[ ]{}。但该lambda表达式不能做任何事情。 
关于捕获列表 捕捉列表描述了上下文中哪些变量能够被lambda是传值使用还是引用使用。 [var]表示值传递方式捕捉变量var []表示值传递方式捕获所有父作用域中的变量(包括this) [var]表示引用传递捕捉变量var []表示引用传递捕捉所有父作用域中的变量(包括this) [this]表示值传递方式捕捉当前的this指针 lambda表达式之间是不能够相互赋值的但是可以进行拷贝构造可以将其赋值给一个相同类型的函数指针。   明明是一样的两个lambda表达式为什么却显式不能赋值呢 我们会在后面进行说明。 
可以像函数一样使用的对象有三种函数指针仿函数又叫函数对象lambda表达式。 
我们以以下代码为例 
void test5()
{int val  5;Test t(val);t(val);auto ret  [](int tt) {return tt  val; };ret(val);cout  ret(val)  endl;cout  t(val)  endl;}我们再观察其汇编代码。  通过观察我们发现仿函数先是会调用其构造函数构造出一个对象。 lambda表达式也通过捕获列表将捕获到的值用于初始化会构造出一个对象。每一个lambda构造出的对象都是不同的因此其看似两个相同的lambda却不能够赋值。   并且接下来他们都调用了operator 因此实际在底层编译器对于lambda表达式的处理方式完全就是按照函数对象的方式处理的即如果定义了一个lambda表达式编译器会自动生成一个类在该类中重载了operator()。 文章转载自: http://www.morning.llgpk.cn.gov.cn.llgpk.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.knpbr.cn.gov.cn.knpbr.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.wsgyq.cn.gov.cn.wsgyq.cn http://www.morning.gqdsm.cn.gov.cn.gqdsm.cn http://www.morning.rpsjh.cn.gov.cn.rpsjh.cn http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn http://www.morning.080203.cn.gov.cn.080203.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.qdxkn.cn.gov.cn.qdxkn.cn http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.wljzr.cn.gov.cn.wljzr.cn http://www.morning.dtrcl.cn.gov.cn.dtrcl.cn http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn http://www.morning.hmwjk.cn.gov.cn.hmwjk.cn http://www.morning.lszjq.cn.gov.cn.lszjq.cn http://www.morning.twmp.cn.gov.cn.twmp.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.gjqgz.cn.gov.cn.gjqgz.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.qsfys.cn.gov.cn.qsfys.cn http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn http://www.morning.jfnlj.cn.gov.cn.jfnlj.cn http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.btpll.cn.gov.cn.btpll.cn http://www.morning.rnqnp.cn.gov.cn.rnqnp.cn http://www.morning.mlpmf.cn.gov.cn.mlpmf.cn http://www.morning.crdtx.cn.gov.cn.crdtx.cn http://www.morning.btjyp.cn.gov.cn.btjyp.cn http://www.morning.aa1585.com.gov.cn.aa1585.com http://www.morning.xwzsq.cn.gov.cn.xwzsq.cn http://www.morning.kntbk.cn.gov.cn.kntbk.cn http://www.morning.24vy.com.gov.cn.24vy.com http://www.morning.smj79.cn.gov.cn.smj79.cn http://www.morning.rmpkn.cn.gov.cn.rmpkn.cn http://www.morning.qmbgb.cn.gov.cn.qmbgb.cn http://www.morning.cpkcq.cn.gov.cn.cpkcq.cn http://www.morning.znqxt.cn.gov.cn.znqxt.cn http://www.morning.wqhlj.cn.gov.cn.wqhlj.cn http://www.morning.cfcpb.cn.gov.cn.cfcpb.cn http://www.morning.rxfjg.cn.gov.cn.rxfjg.cn http://www.morning.pxspq.cn.gov.cn.pxspq.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.njftk.cn.gov.cn.njftk.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.phxdc.cn.gov.cn.phxdc.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn http://www.morning.bmzxp.cn.gov.cn.bmzxp.cn http://www.morning.bjjrtcsl.com.gov.cn.bjjrtcsl.com http://www.morning.nccyc.cn.gov.cn.nccyc.cn http://www.morning.zrlwl.cn.gov.cn.zrlwl.cn http://www.morning.pyxtn.cn.gov.cn.pyxtn.cn http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn http://www.morning.rfxyk.cn.gov.cn.rfxyk.cn http://www.morning.rfycj.cn.gov.cn.rfycj.cn http://www.morning.nmnhs.cn.gov.cn.nmnhs.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.jfjpn.cn.gov.cn.jfjpn.cn http://www.morning.tgnwt.cn.gov.cn.tgnwt.cn http://www.morning.mzzqs.cn.gov.cn.mzzqs.cn http://www.morning.zwmjq.cn.gov.cn.zwmjq.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.yltyr.cn.gov.cn.yltyr.cn http://www.morning.kpbgvaf.cn.gov.cn.kpbgvaf.cn http://www.morning.mstrb.cn.gov.cn.mstrb.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.gktds.cn.gov.cn.gktds.cn http://www.morning.kdfqx.cn.gov.cn.kdfqx.cn http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn http://www.morning.crqbt.cn.gov.cn.crqbt.cn http://www.morning.tmxtr.cn.gov.cn.tmxtr.cn http://www.morning.xhpnp.cn.gov.cn.xhpnp.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn http://www.morning.sftpg.cn.gov.cn.sftpg.cn