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

王烨雄seo入门教学

王烨雄,seo入门教学,深圳网站建设服务公,wordpress 旅游 主题左值引用和右值引用 传统的C语法中就有引用的语法#xff0c;而C11中新增了的右值引用语法特性#xff0c;所以从现在开始我们 之前学习的引用就叫做左值引用。无论左值引用还是右值引用#xff0c;都是给对象取别名。 什么是左值#xff1f;什么是左值引用#xff1f;…左值引用和右值引用 传统的C语法中就有引用的语法而C11中新增了的右值引用语法特性所以从现在开始我们 之前学习的引用就叫做左值引用。无论左值引用还是右值引用都是给对象取别名。 什么是左值什么是左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针)我们可以获取它的地址并且在大多数情况下可以对它赋值左值可以出现赋值符号的左边右值不能出现在赋值符号左边。定义时const修饰符后的左值不能给他赋值但是可以取它的地址。左值引用就是给左值的引用给左值取别名。 int main() {//以下的都是左值int* p new int(0);int a 1;const int b 2;//以下是对上面左值的左值引用int* rp p;int ra a;const int rb b;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; } 需要注意的是右值是不能取地址的但是给右值取别名后会导致右值被存储到特定位置且可 以取到该位置的地址也就是说例如不能取字面量10的地址但是rr1引用后可以对rr1取地 址也可以修改rr1。如果不想rr1被修改可以用const int rr1 去引用。 int main() {double x 1.1, y 2.2;int rr1 10;const double rr2 x y;rr1 20;rr2 5.5;  // 报错return 0; } 左值引用与右值引用比较 左值引用总结 左值引用只能引用左值不能引用右值。 但是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; } 右值引用总结 右值引用只能右值不能引用左值。 但是右值引用可以move以后的左值。 int main() {// 右值引用只能右值不能引用左值。int r1 10;// error C2440: “初始化”: 无法从“int”转换为“int ”// message : 无法将左值绑定到右值引用int a 10;int r2 a;// 右值引用可以引用move以后的左值int r3 std::move(a);//还可以通过强制类型转换int r4 (int)a;return 0; } 右值引用使用和意义 前面我们可以看到左值引用既可以引用左值和又可以引用右值那为什么C11还要提出右值引 用呢是不是化蛇添足呢下面我们来看看左值引用的短板右值引用是如何补齐这个短板的 namespace bite {class string{public:typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str _size;}string(const char* str ):_size(strlen(str)), _capacity(_size){//cout string(char* str) endl;_str new char[_capacity 1];strcpy(_str, str);}// s1.swap(s2)void swap(string s){::swap(_str, s._str);::swap(_size, s._size);::swap(_capacity, s._capacity);}// 拷贝构造string(const string s):_str(nullptr){cout string(const string s) -- 深拷贝 endl;string tmp(s._str);swap(tmp);}// 赋值重载string operator(const string s){cout string operator(string s) -- 深拷贝 endl;string tmp(s);swap(tmp);return *this;}// 移动构造string(string s):_str(nullptr), _size(0), _capacity(0){cout string(string s) endl;swap(s);}// 移动赋值string operator(string s){cout string operator(string s) endl;swap(s);return *this;}~string(){delete[] _str;_str nullptr;}char operator[](size_t pos){assert(pos _size);return _str[pos];}void reserve(size_t n){if (n _capacity){char* tmp new char[n 1];strcpy(tmp, _str);delete[] _str;_str tmp;_capacity n;}}void push_back(char ch){if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] ch;_size;_str[_size] \0;}//string operator(char ch)string operator(char ch){push_back(ch);return *this;}const char* c_str() const{return _str;}private:char* _str;size_t _size;size_t _capacity; // 不包含最后做标识的\0};bite::string to_string(int value){bool flag true;if (value 0){flag false;value 0 - value;}bite::string str;while (value 0){int x value % 10;value / 10;str (0 x);}if (flag false){str -;}std::reverse(str.begin(), str.end());return str;} }左值引用的使用场景 做参数和做返回值都可以提高效率。 左值引用的短板但是当函数返回对象是一个局部变量出了函数作用域就不存在了就不能使用左值引用返回 只能传值返回。例如bit::string to_string(int value)函数中可以看到这里只能使用传值返回 传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造)。 右值引用和移动语义解决上述问题 移动构造本质是将参数右值的资源窃取过来占位已有那么就不 用做深拷贝了所以它叫做移动构造就是窃取别人的资源来构造自己。 移动构造Move Constructor与移动赋值Move Assignment是C11及以后版本中引入的重要特性它们主要用于优化资源管理和提高程序性能特别是在处理大型对象或涉及资源管理的类时。以下是关于移动构造与移动赋值的详细解释 移动构造 定义 移动构造是一种特殊的构造函数它通过接收一个右值引用rvalue reference参数来创建新对象并从传入的对象中“移动”资源而不是执行深拷贝。移动构造函数的参数类型通常为类类型的右值引用如MyClass(MyClass other)它允许将资源的所有权从临时对象或即将被销毁的对象转移到新创建的对象中从而避免不必要的资源复制。 应用场景 函数返回临时对象在函数中返回临时对象时可以通过移动构造函数避免不必要的拷贝操作。容器操作在容器中插入或删除临时对象时移动构造函数可以实现高效操作。资源管理对于需要管理底层资源如内存、文件句柄等的类移动构造可以实现资源的转移和所有权的转移。 实现步骤 资源转移将参数右值的资源如动态分配的内存、文件句柄等转移到新对象中。置空原对象将原对象的相应资源指针或引用置为空如nullptr以确保在析构时不会重复释放资源。 移动赋值 定义 移动赋值是一种特殊的成员函数通常重载赋值运算符operator它允许将一个对象的资源从另一个对象“移动”到当前对象而不是进行拷贝。移动赋值运算符通常接受一个右值引用类型的参数并执行资源的转移操作。 应用场景 对象赋值当需要将一个即将被销毁的对象的资源转移到另一个对象时可以使用移动赋值。资源管理与移动构造类似移动赋值也适用于需要管理底层资源的类。 实现步骤 自我赋值检查首先检查是否是自我赋值即this other以避免不必要的操作。资源释放如果当前对象已经持有资源需要先释放这些资源。资源转移将参数右值的资源转移到当前对象中。置空原对象将原对象的相应资源指针或引用置为空。返回当前对象引用返回*this以支持链式调用。 总结 移动构造与移动赋值是C11及以后版本中用于优化资源管理和提高程序性能的重要特性。它们通过资源的转移而不是拷贝来减少不必要的开销特别适用于处理大型对象或涉及资源管理的类。在实现时需要注意资源的正确转移和置空原对象以避免资源泄露或重复释放。
http://www.dnsts.com.cn/news/103107.html

相关文章:

  • WordPress主题DUX主题优化网站公司
  • 华云电力建设监理公司网站有没有做catalog的网站
  • 非寻服饰网站建设规划书网站运营维护工作 基本内容包括
  • 品牌的佛山网站建设个人电影网站备案
  • 带询盘外贸网站源码怎么做企业网站推广的方法
  • 金湖网站推广怎样查看别人网站流量
  • 怎做网站转app手机wap网站下载
  • 做网站时会遇到什么问题千年之恋网页制作代码
  • 做的网站怎么放到网上附近广告设计与制作
  • 如何给给公司建立网站网站前端需要会什么
  • 东莞 网站制作四川建设银行手机银行下载官方网站下载安装
  • 凤阳县建设局网站网站建设和架构
  • 免费个人网站搭建个人艺术作品网站建设策划书
  • html特效网站能够做二维码网站
  • 国外家装设计网站广告设计
  • 2019 做网站如何免费制作一个公司网站
  • 做模版网站重庆网红打卡点有哪些地方
  • 网站标题的优化威海泰浩建设集团有限公司网站
  • 如何搭建高访问量的网站wordpress twenty twelve修改
  • 新网站建设教程代刷网站搭建教程
  • 烟台赶集网网站建设养老网站建设合同
  • 互联网招聘网站排名能自己做游戏的软件
  • 南通网站建设排名公司哪家好长春市长春网站建设
  • 什么是php网站1核1g可以做几个网站
  • 可以做推送的网站什么是小程序商城
  • 企业网站建设 新闻宣传wordpress七牛云图床
  • 中国室内设计师联盟网站do_action wordpress
  • 自己怎么在电脑上做网站广州app开发
  • 软件人员外包重庆网站seo技术
  • 企业网站实名审核中心广州办营业执照