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

如何设计网站首页今日头条新闻大事

如何设计网站首页,今日头条新闻大事,做研学的网站,交互做的好网站目录 左值 右值 左值引用与右值引用比较 左值引用总结: 右值引用总结: 左值引用的使用场景: 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板: 右值引用和移动语义解决上述问题: 下面就是有移动…

目录

左值

右值

左值引用与右值引用比较

左值引用总结:

右值引用总结:

左值引用的使用场景:

引用传参和做返回值都可以提高效率(减少拷贝)

左值引用的短板:

右值引用和移动语义解决上述问题:

下面就是有移动构造的情况

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

STL中的容器都是增加了移动构造和移动赋值

右值引用的使用问题:​编辑


左值

        左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。

定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址

int main()
{// 以下的p、b、c、*p都是左值int* p = new int(0);int b = 1;const int c = 2;// 以下几个是对上面左值的左值引用int*& rp = p;int& rb = b;const int& rc = c;int& pvalue = *p;return 0;
}

右值

        右值也是一个表示数据的表达式,不能取地址 如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。

int main()
{double x = 1.1, y = 2.2;// 以下几个都是常见的右值10;x + y;fmin(x, y);// 以下几个都是对右值的右值引用int&& rr1 = 10;double&& rr2 = x + y;double&& rr3 = fmin(x, y);// 这里编译会报错:error C2106: “=”: 左操作数必须为左值10 = 1;x + y = 1;fmin(x, y) = 1;return 0;
}

左值引用就是给左值的引用,给左值取别名

右值引用就是对右值的引用,给右值取别名

左值引用与右值引用比较

左值引用总结:

        1. 左值引用只能引用左值,不能引用右值。

        2. 但是const左值引用既可引用左值,也可引用右值 (匿名对象传参)

int main()
{// 左值引用只能引用左值,不能引用右值。int a = 10;int& ra1 = a;   // ra为a的别名//int& ra2 = 10;   // 编译失败,因为10是右值// const左值引用既可引用左值,也可引用右值。const int& ra3 = 10;const int& ra4 = a;return 0;
}

右值引用总结:

        1. 右值引用只能右值,不能引用左值。

        2. 但是右值引用可以move以后的左值。

        move(左值1)是右值 , move()相当于类型转换.

        左值1还是左值

int main()
{// 右值引用只能右值,不能引用左值。int&& r1 = 10;// error C2440: “初始化”: 无法从“int”转换为“int &&”// message : 无法将左值绑定到右值引用int a = 10;int&& r2 = a;// 右值引用可以引用move以后的左值int&& r3 = std::move(a);return 0;
}

左值引用的使用场景:

引用传参和做返回值都可以提高效率(减少拷贝)

void func1(bit::string s)
{}
void func2(const bit::string& s)
{}
int main()
{bit::string s1("hello world");// func1和func2的调用我们可以看到左值引用做参数减少了拷贝,提高效率的使用场景和价值func1(s1);func2(s1);// string operator+=(char ch) 传值返回存在深拷贝// string& operator+=(char ch) 传左值引用没有拷贝提高了效率s1 += '!';return 0;
}

左值引用的短板:

        但是当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回, 只能传值返回。

        但是传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造,新的编译器会进行优化)。

编译器优化情况

右值引用和移动语义解决上述问题:

        在string中增加移动构造(参数是右值),移动构造本质是将参数右值的资源窃取过来(右值(将亡值)不会被释放),会被占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是利用别人的资源来构造自己

解决了这种问题

如果同时有拷贝构造(const string& s)和移动构造(string&& s)

        传左值时会用拷贝构造

        传右值时会用移动构造

下面就是有移动构造的情况

// 移动构造
string(string&& s):_str(nullptr),_size(0),_capacity(0)
{cout << "string(string&& s) -- 移动语义" << endl;swap(s);
}int main()
{bit::string ret2 = bit::to_string(-1234);return 0;
}

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

        在string类中增加移动赋值函数,再去调用to_string(1234),不过这次是将 to_string(1234)返回的对象赋值给s1对象,这时调用的是移动赋值。

// 移动赋值
string& operator=(string&& s)
{cout << "string& operator=(string&& s) -- 移动语义" << endl;swap(s);return *this;
}

写了移动赋值后,这里运行后,我们看到调用了两次构造和一次移动赋值。

        第一次构造是构造s1,第二次是构造str, 移动赋值是将str利用.

STL中的容器都是增加了移动构造和移动赋值

所以使用容器时尽可能传输匿名对象可以提高效率.

右值引用的使用问题:

在使用时应该注意左右值的转化

在接受一次后会使,右值变成左值

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

http://www.tj-hxxt.cn/news/51063.html

相关文章:

  • 做网站怎么做多少钱成都网站制作
  • 在广州开发一个营销网站多少钱企业培训有哪些方面
  • 可信的大连网站建设百度平台客服
  • 电子商务网站网站建设品牌线上推广方案
  • 网站开发实战 王上海网络优化服务
  • 上海网站建设 排名长沙做网站的公司有哪些
  • 做网站的基本知识市场营销计划方案
  • 未来做哪些网站能致富电脑网页制作
  • 网站建设哪家售后做的好营销策划公司名字
  • 小公司做网站推广引流软件
  • 德州做网站公司网站维护公司
  • WordPress放B站俄罗斯搜索引擎yandex推广
  • 用visual做的网站东莞网站seo优化
  • 新余网站建设整站seo外包
  • 非物质文化遗产网站怎么做网站优化方式有哪些
  • wordpress open sansseo公司资源
  • 厦门图书馆网站建设成都营销推广公司
  • 站长之家点击进入广州网站关键词排名
  • 模仿做网站在线推广企业网站的方法
  • 百度是不是只有在自己的网站发布才会被收录自助优化排名工具
  • 常州做网站优化app推广注册赚钱
  • 百度重庆营销中心windows优化大师官方免费下载
  • 海南所有的网站建设类公司策划网络营销活动
  • 一级a做爰片免费网站中国片深圳网站建设服务
  • 建筑信息查询平台seo排名技术教程
  • 可以做初中地理题的网站北京百度推广代理公司
  • 请问做网站怎么赚钱上往建站
  • 网站后台能进前台空白中国十大企业培训公司
  • 申请了域名先做网站还是先备案企业如何做网站
  • 重庆市建设工程管理信息网win7系统优化