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

领券的网站怎么建设内网建设网站需要什么条件

领券的网站怎么建设,内网建设网站需要什么条件,信阳网站开发建设公司,常德公交网站C11是C语言的一个重要版本#xff0c;引入了许多新的特性和改进。接下来进行这些新特性的学习#xff01; 1.nullptr的引入 在C语言中#xff0c;NULL表示空地址。而C中NULL被定义为字面量0。 这里我们通过打印x的类型名#xff0c;发现NULL的类型名是int#xff0c;而对…C11是C语言的一个重要版本引入了许多新的特性和改进。接下来进行这些新特性的学习 1.nullptr的引入 在C语言中NULL表示空地址。而C中NULL被定义为字面量0。 这里我们通过打印x的类型名发现NULL的类型名是int而对于NULL既能够表示指针值又可以能表示int值所以C11引入了nullptr关键字来表示空指针 2.列表初始化 2.1.语法层面 我们先通过一段代码来学习一下列表初始化这个新特性 struct Point {int _x;int _y; };class Date { public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout Date(int year, int month, int day) endl;}private:int _year;int _month;int _day; };// 语法层面上 // 一切都可以用列表初始化 // 并且可以省略掉 void part1_0() {int i 0;int j { 0 };int k{ 0 };int array1[] { 1, 2, 3, 4, 5 };int array2[]{ 1, 2, 3, 4, 5 };int array3[5] { 0 };int array4[5]{ 0 };Point p1 { 1, 2 };Point p2{ 1, 2 };// 日期类需要传入参数Date d1(2023, 11, 25);// 类型转换 构造拷贝构造 优化直接构造Date d2 { 2023, 11, 25 };Date d3{ 2023, 11, 25 };const Date d4 { 2023, 11, 25 };Date* pd1 new Date[3]{ d1, d2, d3 };Date* pd2 new Date[3]{ {2022, 11, 25}, {2022, 11, 26}, {2022, 11, 27} };}通过这段代码的学习我们学习到了以后我们定义变量构造对象时可以不用在借助操作符可以直接通过{ }来实现但是列表初始化只是为了实现这个功能吗当然不是的我们接下来通过底层来探讨列表初始化。 2.2.列表初始化的作用 如图我们在日期类中定义初始化函数是通过传入3个int类型的参数当我们传入4个参数时会报错 “初始化”: 无法从“initializer list”转换为“Date”无构造函数可以接受源类型或构造函数重载决策不明确 这两个问题第二个是根本上的问题因为传入的参数数量不匹配。这里涉及先进行构造再进行拷贝构造来传入参数实现 第一个报错是什么意思呢为什么vector类型可以随意的增加参数的数量而不会报错呢 答因为vector以及大部分的STL容器中在C11版本后支持initializer list这个结构不支持这个结构的结构体无法进行多参数的调整转化传入参数需要与构造函数参数个数匹配。 为了进一步验证这个initializer list结构的作用我们通过手搓一个vector但是不实现initializer list模块来探讨一下能不能进行随意地增加参数重生之C学习vector-CSDN博客 我们在这个博客中最终的代码对这段代码进行测试 结果是我们无法的实现参数的随意增加 当我们在vector模块增加一个由initializer_list支持的构造函数我们就能够实现我们的随意增加减少我们传入的参数了 my_vector(initializer_listT il) {reserve(il.size());for (auto e : il){push_back(e);} } 讲到这里我们已经知道了列表初始化的作用简化代码提供了更灵活的初始化方式。  mapstring, string dict {{insert, 插入}, {get,获取} }; for (auto kv : dict) {cout kv.first : kv.second endl; } 如上我们通过初始化列表对map的便捷初始化  2.3.initializer list initializer list本质上就是一个类内部封装着这几个函数 通过这段代码我们发现il1的类型是初始化列表也就是我们通过方括号的形式传入参数的本质就是通过传入初始化列表这个对象给对应的容器来实现容器的构造那么大部分的容器也就是通过支持传入initializer list这个对象的构造函数来实现{ }的多个参数的传入而对于没有实现这个构造函数的自然就必须按照自身的构造函数规则进行了。 // the type of il is an initializer_list auto il1 { 10, 20, 30, 40, 50 }; cout typeid(il1).name() endl; 3.auto和decltype auto 和 decltype都可以推导对象的类型而auto是用来定义变量时作为一个简易的语法糖不能够用来实例化对象。 // auto推导类型其中i是已定义的一个int类型d是double类型auto j i;auto ret i * d;// 类型以字符串形式获取到cout typeid(j).name() endl;cout typeid(ret).name() endl; 打印内容为int和double这里auto分别推导出j、ret两个变量的类型 // auto在设置时并没有实例化作为实际类型的能力auto应用场景不足vectorauto ret v1;auto (ret) y; 假设我们在某些场景中需要推导出一个复合类型的实际类型是什么并且将这个类型用STL容器存放显然在上面的讲解中我们发现auto无法胜任这个场景。所以C11提供了decltype这个关键字。 // 用ret的类型去实例化vector// decltype可以推导对象的类型。// 可以用来模板实参或者再定义对象vectordecltype(ret) v;v.push_back(1);v.push_back(1.1);for (auto e : v){cout e ;}cout endl; 4. 右值引用 4.1.左值和右值 左值lvalue 左值是指那些可以出现在赋值操作左侧的表达式。它们通常表示一个对象的身份即它们在内存中的位置。左值有一个持久的存储位置并且可以通过取地址操作符  获得其地址。大部分变量包括全局变量、局部变量、静态变量等都是左值。 // 左值 表示可以取地址的值int i 0;int j i;右值rvalue 右值是指那些只能出现在赋值操作右侧的表达式。它们通常表示临时对象或即将被销毁的对象因此没有持久的存储位置。右值不能通过取地址操作符  获取其地址。在C11之前右值主要包括字面量、临时对象以及函数调用返回的非引用对象。 // 右值10;int func();i j;func(); 一言以蔽之只要某一个值能取到地址的就是左值右值无法取到地址因为临时变量和将要销毁的变量的地址在当前生命周期即将释放。  4.2.左值和右值引用 // 左值引用int r_i i;int r_j j;// 10虽然是右值但是const int属于左值引用对常量const int r_c 10;// 右值不能进行左值引用// int r1 10;// int r2 i j;// 右值引用对临时值、常量进行引用int rr1 10;int rr2 i j;int rr3 func();// 右值引用不能绑定左值// int rr4 i;// 通过move可以将左值进行右值引用int rr4 move(i); 左值引用的语法是一个而右值引用是并且左值引用不能绑定右值右值引用不能绑定左值但是我们可以通过move函数实现右值引用绑定左值。  4.3.右值引用和移动语义 在C11中引入了右值引用rvalue reference的概念使用  符号表示。右值引用允许我们绑定到右值从而可以高效地处理临时对象或即将被销毁的对象避免不必要的拷贝操作。这种技术被称为移动语义move semantics。 通过移动语义我们可以将资源如动态分配的内存、文件句柄等从一个对象“移动”到另一个对象而不是复制它们。这通常比复制更快并且可以避免不必要的资源分配和释放。 那么接下来我们通过两个个场景的学习来体会一下右值引用和移动语义…… 首先我们要知道为什么我们可以使用左值引用左值引用需要可以取得到左值的地址因为左值的在当前模块的声明周期较长。 int func() {int i 10;int j i;return i; } 在这个场景中我们能修改func的返回类型为int左值引用返回值吗很显然是不行的因为i变量在函数模块中可以被引用为j这时他的生命周期较长。而当我们return时这个i已经变成了即将销毁的对象将亡值所以不能够被引用了这也就是左值引用无法解决的场景。 那么这时我们修改一下将这个函数变成右值引用返回这时这个问题就解决了。 int func() {int i 10;int j i;return move(i); } int main() {int rr1 func(); } 联系一下右值引用和移动语义的作用会减少不必要的拷贝工作如图我们发现在func中的i的地址最终移动到了rr1中 但是减少不必要的拷贝没有得到较好的体现 接着我们用新的场景来体现代码部分还是从以往博客的综合处获得   重生之C学习string的实现-CSDN博客 void test() {myString::my_string s1;s1 myString::to_string(1234);for (auto e : s1){cout e ;} }我们写一个测试函数在这个函数中我们想要实现的逻辑创建字符串对象s1然后通过to_string函数实现数字转化为字符串形式。接下来我们来研究一下实现这个功能的代码 主要是因为我们当前的my_string这个类中只支持了左值引用的拷贝构造函数和操作符重载而当我们希望将右值的这个ret通过这两个函数传入給s1时需要进行拷贝构造出一个临时对象然后在给s1这里就多了一步临时变量的创建和销毁因此在上图中我们发现ret和s1对应的_str存在两份地址但是明明表示的就是一个东西。 这里的原因是编译器会默认将右值通过构造一个新的左值来进行左值引用所以并不是右值可以作为左值引用类型的参数。所以就会出现这个新的左值可能带来不必要的拷贝尤其是一些复杂的类型因为内部可能维护了很多变量。 接下来我们给这个string支持右值引用这里利用了编译器会自动选择更加符合的类型的函数进行调用那么对于右值引用类型就不会去创建一个临时变量来实现左值引用传入了。那么就减少了这一步临时变量的创建和释放 my_string(my_string s) {std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity); } my_string operator(my_string s) { std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);return *this; } 接着我们再次打开调试窗口 发现 我们支持右值引用后ret和s1的_str共用一块地址了也就是地址实现了从一个将要释放的快要结束生命周期的临时变量移动到了另一个对象这个就是移动语义。 所以使用“右值引用”可以帮助我们完成一些左值引用存在缺陷的场景这些场景往往都是需要额外开辟和释放空间来实现右值往左值的转化来间接进行左值的操作而C11提供右值引用这个语法来进行右值直接向生命周期长的对象进行转移。
http://www.zqtcl.cn/news/291976/

相关文章:

  • 网站怎么推广软文政务网站建设存在问题
  • 公司官方网站建设需要多少钱wordpress单页面制作
  • 社群网站建设网站推广的方式有哪几种
  • 培训机构活动策划网站wordpress 改端口
  • 北京网站制作与营销培训用asp做网站视频
  • 江苏丹阳建设公司网站做网站中的剪辑图片
  • 纯静态网站怎样广州工程造价信息网
  • 为什么网页不能打开建设银行网站企业网站开发综合实训
  • 企业网站制作 深圳网站建站行业公司主页建设
  • 外汇直播网站建设开发做网站空间商需要办什么手续
  • 源码哥网站的模板皮肤病在线咨询医生免费咨询
  • 温岭市市住房和城乡建设规划局网站附近的电脑培训班在哪里
  • 网站备案百度站长提交减肥网站源码
  • 网站添加文章机械代加工厂家
  • 学做各种糕点的网站cn网站建设多少钱
  • 首页网站关键词优化教程如何查询网站点击率
  • 文章类型的网站模版北京朝阳区房价2023年最新房价
  • wap网站发布注销主体和注销网站
  • 微信小程序 做网站满足客户的分销管理系统
  • 高佣联盟做成网站怎么做wordpress 更新版本
  • 杭州营销网站建设公司成都网站排名优化报价
  • 网站建设设计哪家好太原新建火车站
  • 医疗网站建设信息cps推广平台有哪些
  • rp怎么做网站备案 添加网站
  • 汕尾手机网站设计淘宝客做网站怎么做
  • 营口公司网站建设网站百度seo关键词优化
  • 网站开发命名规范汉中网站制作
  • 嘉定网站建设公司泗水做网站ys178
  • 邯郸网站设计招聘网齐家网和土巴兔装修哪家好
  • 京东网站推广方式jquery网页设计成品