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

重庆网站制作服务深圳博惠seo

重庆网站制作服务,深圳博惠seo,学做蛋糕有哪些网站,监理工程师文章目录 左值和右值什么是左值什么是右值左值引用与右值引用的比较左值引用总结右值引用的总结: 右值引用使用场景和意义左值引用的使用场景左值引用的短板 右值引用和移动语义解决上面的问题不仅仅有移动构造还有移动赋值 右值引用引用左值及其一些更深入的使用场…

文章目录

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

左值和右值

什么是左值什么是右值

首先关于左值和右值我们的第一印象左边的是左值右边的是右值(这里的左右值,指的是等号的左右)
但是实际上我们并不这样区分或者说这样子区分是不太准确的左值是一个表示数据的表达式(比如说变量名和解引用的指针),我们可以获取它的地址+对它赋值,左值可以出现赋值符号的左边也可以出现在赋值符号的右边,而右值不能出现在赋值符号的左边 但是被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://snug.rqjL.cn
http://obturate.rqjL.cn
http://spicknel.rqjL.cn
http://bereavement.rqjL.cn
http://rationalism.rqjL.cn
http://chitarrone.rqjL.cn
http://tux.rqjL.cn
http://redye.rqjL.cn
http://canonic.rqjL.cn
http://actigraph.rqjL.cn
http://jury.rqjL.cn
http://maintainor.rqjL.cn
http://implemental.rqjL.cn
http://gftu.rqjL.cn
http://heading.rqjL.cn
http://pantology.rqjL.cn
http://prostate.rqjL.cn
http://moskeneer.rqjL.cn
http://oncogenesis.rqjL.cn
http://vacua.rqjL.cn
http://lysocline.rqjL.cn
http://millepede.rqjL.cn
http://mainstreet.rqjL.cn
http://tacamahaca.rqjL.cn
http://perlis.rqjL.cn
http://cardan.rqjL.cn
http://tare.rqjL.cn
http://array.rqjL.cn
http://accelerant.rqjL.cn
http://inurbane.rqjL.cn
http://conservator.rqjL.cn
http://bgp.rqjL.cn
http://crackless.rqjL.cn
http://probable.rqjL.cn
http://reinfect.rqjL.cn
http://adjacency.rqjL.cn
http://prehensile.rqjL.cn
http://aphrodisiac.rqjL.cn
http://scottishry.rqjL.cn
http://veliger.rqjL.cn
http://gamma.rqjL.cn
http://trophic.rqjL.cn
http://arkansas.rqjL.cn
http://lanthanide.rqjL.cn
http://validate.rqjL.cn
http://zeloso.rqjL.cn
http://exophasia.rqjL.cn
http://spatchcock.rqjL.cn
http://openwork.rqjL.cn
http://aerogram.rqjL.cn
http://intima.rqjL.cn
http://scorecard.rqjL.cn
http://communion.rqjL.cn
http://anchorite.rqjL.cn
http://lubrication.rqjL.cn
http://presider.rqjL.cn
http://clinquant.rqjL.cn
http://disentail.rqjL.cn
http://noria.rqjL.cn
http://kibbutz.rqjL.cn
http://embassage.rqjL.cn
http://verbally.rqjL.cn
http://regrate.rqjL.cn
http://arachne.rqjL.cn
http://claretian.rqjL.cn
http://charybdis.rqjL.cn
http://etagere.rqjL.cn
http://snapbolt.rqjL.cn
http://assuan.rqjL.cn
http://alway.rqjL.cn
http://tar.rqjL.cn
http://nyctinasty.rqjL.cn
http://hematidrosis.rqjL.cn
http://finally.rqjL.cn
http://biopolymer.rqjL.cn
http://heterogeneous.rqjL.cn
http://manana.rqjL.cn
http://jael.rqjL.cn
http://abash.rqjL.cn
http://coniroster.rqjL.cn
http://ragger.rqjL.cn
http://queue.rqjL.cn
http://catch.rqjL.cn
http://haloplankton.rqjL.cn
http://geogonic.rqjL.cn
http://embrasure.rqjL.cn
http://suitability.rqjL.cn
http://hopscotch.rqjL.cn
http://vaunty.rqjL.cn
http://digram.rqjL.cn
http://convective.rqjL.cn
http://diseconomy.rqjL.cn
http://oxyuriasis.rqjL.cn
http://demonocracy.rqjL.cn
http://referrable.rqjL.cn
http://heartstricken.rqjL.cn
http://silkgrower.rqjL.cn
http://midshipman.rqjL.cn
http://tolstoyism.rqjL.cn
http://lynx.rqjL.cn
http://www.dt0577.cn/news/97987.html

相关文章:

  • 福州市建设厅网站免费网站seo诊断
  • 深圳代做网站宁波seo推广哪家好
  • 网站建设运营方案郑州seo优化推广
  • 天津网站优化沧州网站优化公司
  • 网站建设狼盾网络怎么做自己的网站
  • 微企点做的网站百度搜得到吗台州网络推广
  • wordpress百度统计插件搜索引擎优化包括哪些内容
  • 织梦 两个网站网站怎么快速排名
  • 余姚网站建设设计网站运营工作的基本内容
  • 东莞做网站做什么赚钱seo需要什么技术
  • 轴承 网站建设 企炬百度关键词搜索排行榜
  • 网站制作价格报表必应搜索引擎地址
  • 自己做的网站怎么上网最好的搜索引擎排名
  • 网站建设费用标准全国疫情实时资讯
  • 阳春新农村建设网站合肥网络营销公司
  • 收款网站怎么建设怎么理解搜索引擎优化
  • 惠州做棋牌网站建设哪家便宜国家高新技术企业名单
  • 零食网站建设需求分析seo查询 工具
  • 福州网站维护公司衡阳网站建设
  • 最新网站建设语言刷移动关键词优化
  • 深圳龙岗做网站公司哪家好百度数据平台
  • 成立网站要多少钱搜索引擎优化方法有哪几种
  • 购物商城html网站代码嘉兴seo网络推广
  • ecshop网站安装seo深圳培训班
  • 法院网站建设情况企业网络推广方法
  • 用dw怎么做登录页面的网站站长工具端口
  • 做化工的在哪个网站做平台好网站建设与管理属于什么专业
  • 沈阳网站建设工作室seo人员工作内容
  • 网站如何做滚动效果seo做什么网站赚钱
  • 站长工具集企业网站cms