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

C++ 11

右值引用(&&)
什么是左值右值:左值表示可以获取地址的值,它能够出现在赋值语句的左边
eg:int a=10;a就是左值
右值表示无法获取地址的对象,例如:常量值、函数返回值、lambda表达式等,无法获取地址,但是并不代表其值不可改变,当定了右值的右值引用时就可以更改右值。

int b=10;
a=b;

a和b都是左值,只不过b可以当做右值使用
右值引用出现的原因:右值往往没有名称,在实际开发中我们可能需要对右值进行修改,因此要使用它只能借助引用的方式
格式:类型&& 引用变量的名称=右值

//实际使用的例子可以见下面
int num=10;
//int &&a=num;//这句不可以,右值引用不可以初始化为左值,num在这里是变量,是左值,左值无法初始化为右值;
int &&a=10;
a=100;
cout<<a<<endl;//输出结果为100,右值引用可以对右值进行修改

右值引用的实际用途:
(1)移动语义:
如果一个类中涉及到资源管理(比如指针),用户必须显示的提供拷贝构造、赋值运算符重载以及析构函数(如果不提供拷贝构造和赋值运算符的重载就会是浅拷贝),否则编译器将会自动生成一个默认的,如果遇到拷贝对象或者对象之间相互赋值,就会出错,比如:

//如果不自己实现拷贝构造函数,就会使用默认的拷贝构造,就是下面的样子,这是浅拷贝
MyClass(const MyClass& other) {// 默认实现拷贝所有成员,包括指针this->ptr = other.ptr; // 浅拷贝
}
//赋值运算:
MyClass& operator=(const MyClass& other) {// 默认实现this->ptr = other.ptr; // 浅拷贝return *this;
}

显示实现:

MyClass(const MyClass& other) {// 分配新的内存并复制数据this->ptr = new Type(*(other.ptr));
}
//赋值运算符:
MyClass& operator=(const MyClass& other) {if (this != &other) { // 防止自赋值delete this->ptr; // 释放旧资源this->ptr = new Type(*(other.ptr)); // 分配新内存并复制数据}return *this;
}

简单来说:A运行出一个结果,通过临时变量B作为返回值给C使用,此时B是临时变量,它充当了传递的作用之后就会析构释放内存(注意,此时B是占用了一块空间用来存放需要它返回给C的数据的),这个时候C就需要再创建一个对象分配空间来拷贝B返回的数据,这个时候换一种方法,不额外给C分配空间了,直接让C接手临时变量(右值)的空间,也就是说C和B的资源的地址是同一个地址,这样既不用给C分配空间又不用释放B的空间,这个时候就节约了开销,右值引用之后也可以对这个变量进行修改等操作。
参考文献: C++11新特性-编程其实也不难-B站
https://blog.csdn.net/ChaoFreeandeasy_/article/details/130229252


http://www.mrgr.cn/news/32875.html

相关文章:

  • Python语法(二)——函数
  • 大连孤独症培训学校谁家好:专注关爱,开启明天
  • 接口自动化测试框架搭建详解
  • pg入门14—pg中的domain是什么
  • Java笔试面试题AI答之设计模式(2)
  • appimage 软件创建桌面快捷图标
  • Python基于大数据的Boss直聘招聘可视化系统,附源码
  • 【图灵完备 Turing Complete】游戏经验攻略分享 Part.5 编程
  • 如何查看linux版本
  • 详解c++:new和delete
  • Android Studio开发发布教程
  • mfc140u.dll丢失不用愁?超详细mfc140u.dll丢失的解决方法
  • 通过标签实现有序:优化你的 FastAPI 生成的 TypeScript 客户端
  • 网页聊天——测试报告——Selenium自动化测试
  • 头歌数据库系统原理数据模型测试
  • 软件设计师——操作系统
  • 【星际探秘 乾坤之外】
  • 动态规划-01背包问题
  • EM算法讲解
  • 什么叫后验分布