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

新手怎么做企业网站个人简历模板免费可编辑

新手怎么做企业网站,个人简历模板免费可编辑,商城服务是什么软件,中企动力做网站多久能好文章目录 左值和右值什么是左值什么是右值左值引用与右值引用的比较左值引用总结右值引用的总结: 右值引用使用场景和意义左值引用的使用场景左值引用的短板 右值引用和移动语义解决上面的问题不仅仅有移动构造还有移动赋值 右值引用引用左值及其一些更深入的使用场…

文章目录

  • 左值和右值
    • 什么是左值什么是右值
    • 左值引用与右值引用的比较
      • 左值引用总结
      • 右值引用的总结:
  • 右值引用使用场景和意义
    • 左值引用的使用场景
    • 左值引用的短板
  • 右值引用和移动语义解决上面的问题
    • 不仅仅有移动构造还有移动赋值
  • 右值引用引用左值及其一些更深入的使用场景分析
  • 完美转发
    • 模板中的&&万能引用

左值和右值

什么是左值什么是右值

首先关于左值和右值我们的第一印象左边的是左值右边的是右值(这里的左右值,指的是等号的左右)
但是实际上我们并不这样区分或者说这样子区分是不太准确的左值是一个表示数据的表达式(比如说变量名和解引用的指针),我们可以获取它的地址+对它赋值,左值可以出现赋值符号的左边也可以出现在赋值符号的右边,而右值不能出现在赋值符号的左边 但是被const定义的左值不能出现在等于号的左边不能给他赋值但是可以取他的地址,因此我们可以通过能否取地址来判断左右值

可以取地址的是左值不可以取地址的是右值

右值可以是一个表达式比如说a+b是一个右值也可以是一个常量比如说10 都是右值。右值引用就是对右值取别名。这里需要注意一个事情常量字符串是属于左值的

左值引用与右值引用的比较

左值引用总结

1.左值引用只能引用左值不能引用右值
2.但是const左值引用可以引用右值。

右值引用的总结:

1.右值引用只能引用右值不能引用左值,
2,但是右值引用可以move以后的右值。

右值引用使用场景和意义

前面我们可以看到左值引用既可以引用左值和又可以引用右值,那为什么要提出右值引用?这里我们需要先从左值引用的短板说起。请看 以下代码这是我自己实现的string

#include"string.h"
clzyf::string func()
{clzyf::string a= "****************";return a;
}
int main()
{clzyf::string b = func();clzyf::string a = b;return 0;
}

请大家看看这里需要拷贝多少次呢?首先如果去掉构造函数的话我们这里的传值返回就需要先拷贝一个临时对象再将临时对象传给b然后在进行销毁,但是我们运行程序的时候会发现这里程序进行了优化那么我们可能会疑惑为什么我们不吧这里定义成引用返回,这里是因为这个函数作用域在接下来是会被销毁的那么这个对象也会被销毁,当将其销毁后其地址也就会释放,那么这里传引用也没用因为这个对象已经被销毁了。
在这里插入图片描述
我们可以发现这里运行程序,也会崩溃,所以这样字是肯定不行的。我们可以总结

左值引用的使用场景

做参数和做返回值都可以提高效率。

左值引用的短板

当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回,
只能传值返回。例如:bit::string to_string(int value)函数中可以看到,这里只能使用传值返回,
传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造)。

右值引用和移动语义解决上面的问题

在string中增加移动构造,移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不
用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己。
我们来给大家看一下代码。

string(string&& s):_str(nullptr)
,_size(0),_capacity(0)
{cout << "string(string&& s) -- 移动语义" << endl;swap(s);
}

在将这个代码加入进去后我们就可以发现再运行的时候这里没有调用深拷贝和拷贝构造而是调用了移动构造移动构造没有新开空间拷贝数据所以效率提高了。
这里为什么可以调用移动构造呢?原因是因为内置类型在这里进行拷贝的时候它本身其实是一个将亡值,那么作为一个将亡值它本身是要被销毁掉的,因此它的地址是不可取的,它属于右值那么就会调用右值引用的移动构造,进行一个swap是的他的资源不被释放而是被交换给b而b的资源则有将亡值销毁的时候进行释放代码如下

#include"string.h"
clzyf::string  func()
{clzyf::string a= "****************";return a;
}
int main()
{clzyf::string b;b = func();return 0;
}

不仅仅有移动构造还有移动赋值

string类中增加移动赋值函数,再去调string(1234),不过这次是将string(1234)返回的右值对象赋值给ret1对象,这时调用的是移动构造。
代码入下

clzyf::string to_string(int  s)
{string str;return str;
}
// 移动赋值
string& operator=(string&& s)
{
cout << "string& operator=(string&& s) -- 移动语义" << endl;
swap(s);
return *this;
}
int main()
{clzyf::string ret1;ret1 = clzyf::string(1234);return 0;
}

这里运行后我们可以看到进行了一次移动构造和一次移动赋值我们这里是先用to_string 返回一个右值然后通过这个右值调用移动赋值来给ret1进行赋值

右值引用引用左值及其一些更深入的使用场景分析

按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?因为:有些场景下,可能
真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move
函数将左值转化为右值。C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,
它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。

完美转发

模板中的&&万能引用

void Fun(int &x){ cout << "左值引用" << endl; }
void Fun(const int &x){ cout << "const 左值引用" << endl; }
void Fun(int &&x){ cout << "右值引用" << endl; }
void Fun(const int &&x){ cout << "const 右值引用" << endl; }
// 模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
// 模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,
// 但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,
// 我们希望能够在传递过程中保持它的左值或者右值的属性, 就需要用我们下面学习的完美转发
template<typename T>
void PerfectForward(T&& t)
{Fun(t);
}
int main()
{PerfectForward(10);           // 右值int a;PerfectForward(a);            // 左值PerfectForward(std::move(a)); // 右值const int b = 8;PerfectForward(b);      // const 左值PerfectForward(std::move(b)); // const 右值return 0;
}

万能引用既可以接受左值也可以接受右值这里的原因是因为这里有个方式就是引用折叠他的格式是模板

template<class T>
void func(T&&t)
{
return;
}

此时这个小t就是一个万能引用万能引用当我们传入左值的时候会进行折叠从而接受左值当我们传入右值的时候不需要折叠本身就是右值因此既可以接受左值对象又可以接受右值

http://www.hyszgw.com/news/59141.html

相关文章:

  • 做海报需要用到什么网站素材网站如何提高用户量
  • 做吃的教程网站模板型网站建设
  • 帝国cms如何做网站地图新网站如何做百度百科
  • 如何在网站上做自动弹出河南省交通基本建设质量检测监督站网站
  • 做网站用什么平台广东高端网站设计公司
  • 怎么做购物网站系统文本wordpress用户注册卡慢
  • js网站访问量统计销售管理系统实验报告
  • 上班没事做看什么网站网站建设找至尚网络
  • 设计网站的企业WordPress背景图片自适应
  • 八大处网站建设网络营销推广的技巧有哪些
  • 做海南旅游网站的初衷vs2010怎么做网站前台
  • 手机网站开发指南网站导航栏不显示
  • 用手机网站做app视频直播网站开发流程
  • 小额贷网站建设wordpress标签小工具
  • 做网站一天打多少个电话wordpress博客文章栏目
  • 郑州网站关键词优化男装商城网站建设
  • dede织梦做的网站 栏目页有切换js 怎么循环子栏目 调子栏目手机网站开发流程
  • 网站建设制作苏州东莞公司网站制作
  • 做网站接广告赚钱吗wordpress主题 html5模板
  • 会议专属网站平台建设报价单淘宝的seo是什么意思
  • wordpress做下载型网站有没有做语文题的网站
  • 合肥学网站设计做网站项目所需资源
  • 提供邯郸wap网站建设网站显示速度的代码是什么情况
  • 网站迁移如何开发一个软件
  • 做网站需要画原型图么海口制作手机网站
  • 最好的网站设计开发公司网站建设必要性和意义
  • 个人网站 主机利搜网站排名软件
  • 石家庄市城乡建设局网站抚州市建设局网站查询
  • 在线软件网站建设百度权重4
  • 潍坊手机网站制作西安网站托管公司招聘