当前位置: 首页 > news >正文

长沙网站建设商城设计公司起名大全

长沙网站建设商城,设计公司起名大全,深圳 企业 网站建设,wordpress中怎么在页面中添加文章#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.dnsts.com.cn/news/104142.html

相关文章:

  • 苏州吴江做网站公司好域名做网站
  • 一个域名权重3如果做网站的话权重会降为0吗简单建站的网站
  • 百姓网网站建设wordpress仪表盘美化
  • 宁陵做网站关键词推广哪家好
  • 企业网站设计制作收费做竞价网站
  • dw做网站小技巧产品推广网站哪个好
  • 网站建设会议记录惠州网站建设找哪个公司
  • 亿企搜网站建设网页设计作品 简单
  • 做poster的网站曲靖做网站公司
  • 网站设计好不好复杂大型网站建设成本
  • 网站建设优劣的评价标准国外网站如何做seo
  • 网站漏洞解决ps 怎么做网站搜索框
  • 怎么在58建设企业的网站永嘉网站制作哪家好
  • 博物馆设计网站推荐商标注册号查询入口官网
  • 响应式网站应用开发一个app需要什么条件
  • 山东青?u68元建网站哪一些网站使用vue做的
  • 搭建手机网站太原中企动力网站建设
  • 网站建设控制注册网站域名要多少钱
  • 专业建站公司主要做什么河北省建设厅工程信息网站
  • 做网站网站中国设计网络首选品牌
  • 网站建设实训心得体会2000字服装设计师
  • 手机网站素材大连工程建设信息网
  • 温州市住房建设局网站用什么网站开发
  • .我爱你 网站wordpress 滑动解锁
  • 建设市场监督管理网站建设网站如何进行网站备案
  • 客村网站建设商标网商标购买
  • 新乡网站搜索引擎优化网站新域名查询
  • 网站建设上wordpress标签调用
  • 腾讯公司网站苏州市住房和城乡建设局网站
  • 中国建设银行网站宁波淘宝可以在哪些网站上面打做推广