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

右值 引用

  • 左值:有内存有名字,是可寻址的变量,有持久性。
  • 右值:没内存没名字,一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。C++中的临时量均作为右值。拷贝构造函数或运算符重载可以使用右值引用作为函数参数,以处理临时量。

CTest t1 = CTest(2);//右侧即为没有名字的右值,创建的临时对象

临时对象的生命周期:所在的语句内。出了语句,就不存在了!!

1、在C++中,std::move函数的主要目的是:将一个左值对象转换为右值引用,从而触发移动语义,允许对象之间的资源转移而不是进行深拷贝

不能将右值转换为左值引用!!

2、左值引用和右值引用

  • 一般左值引用只能绑定左值,右值引用只能绑定右值。
  • 特殊情况 const char& = 'a'其中'a'是右值,但可以绑定至常左值引用上
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "cstring"
using namespace std;class CMyString
{
public:CMyString(const char* p = nullptr){cout << "CMyString(const char*)" << endl;if (p != nullptr){mptr = new char[strlen(p) + 1];strcpy(mptr, p);}else{mptr = new char[1];*mptr = '\0';}//cout << "CMyString()" << endl;}~CMyString(){delete[] mptr;mptr = nullptr;cout << "~CMyString()" << endl;}//左值引用参数的拷贝构造CMyString(const CMyString& str){mptr = new char[strlen(str.mptr) + 1];strcpy(mptr, str.mptr);cout << "CMyString(const CMyString&)" << endl;}//右值引用参数的拷贝构造,临时对象会调用CMyString(CMyString&& str){mptr = str.mptr;str.mptr = nullptr;cout << "CMyString(CMyString&&)" << endl;}//右值引用参数的运算符重载CMyString& operator=(CMyString&& str){cout << "String& operator=(String&&)" << endl;if (this == &str)return *this;delete[] mptr;mptr = str.mptr;str.mptr = nullptr;return *this;}const char* c_str() const { return mptr; }private:char* mptr;friend CMyString operator+(const CMyString& lhs,const CMyString& rhs);friend ostream& operator<<(ostream& out, const CMyString& str);
};CMyString GetString(CMyString& str)
{const char* pstr = str.c_str();CMyString tmpStr(pstr);cout << "--------------------" << endl;return tmpStr;  //本来这里会调用左值引用构造临时对象,但由于tmpStr是临时变量,现在会匹配到右值引用拷贝构造
}//CMyString operator+(const CMyString& lhs,
//                    const CMyString& rhs)
//{
//    cout << "--------------------" << endl;
//    char* ptmp = new char[strlen(lhs.mptr) + strlen(rhs.mptr) + 1];  //存在内存泄露
//    strcpy(ptmp, lhs.mptr);
//    strcat(ptmp, rhs.mptr);
//    return CMyString(ptmp);
//}CMyString operator+(const CMyString& lhs,const CMyString& rhs)
{cout << "--------------------" << endl;// char* ptmp = new char[strlen(lhs.mptr) + strlen(rhs.mptr) + 1];CMyString tmpStr;tmpStr.mptr = new char[strlen(lhs.mptr) + strlen(rhs.mptr) + 1];strcpy(tmpStr.mptr, lhs.mptr);strcat(tmpStr.mptr, rhs.mptr);//先返回再析构:因为new赋给tmpStr,出了函数作用域,临时变量就会调用自身析构函数~CMyString(),从而deletereturn tmpStr;  //tmpStr是右值 调用右值引用的拷贝构造给main中的临时量
}ostream& operator<<(ostream& out, const CMyString& str)
{out << str.mptr;return out;
}int main()
{CMyString str1 = "aaaaaaaaaaaaaaaaa";CMyString str2 = "bbbbbbbbbbbbbb";CMyString str3 = GetString(str1); //main中返回的临时量也属于右值,重载右值引用的等号运算符//1.调用operator+,2.调用右值引用的拷贝构造CMyString str4 = str1 + str2; //重载右值引用的拷贝构造  cout << str3 << endl;cout << "--------------------" << endl;return 0;
}

以上,

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Linux】多路转接epoll
  • 【低光照论文精读】RT-VENet: A Convolutional Network for Real-time Video Enhancement
  • Linux FTP服务问题排查
  • 【信创】Linux上图形化多ping工具--gping的编译安装与打包 _ 统信 _ 麒麟 _ 方德
  • 面试爱考 | 设计模式
  • 理解Android开发中的MVC、MVVM和MVP设计模式
  • Android中的Intent的作用
  • Pandas_sqlite
  • 如何避免 Redis 哈希冲突?
  • Anaconda 安装与使用教程
  • [Web安全 网络安全]-XSS跨脚本攻击
  • 算法:TopK问题
  • “药乡”怀化,按下产业向海“加速键”
  • 95-java synchronized和reentrantlock区别
  • 前后端分离项目--下载功能
  • ES2017异步函数现已正式可用
  • gcc介绍及安装
  • 测试开发系类之接口自动化测试
  • 京东美团研发面经
  • 开源地图数据可视化库——mapnik
  • 聊聊flink的TableFactory
  • 探索 JS 中的模块化
  • 项目管理碎碎念系列之一:干系人管理
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (7)svelte 教程: Props(属性)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)c52学习之旅-点亮LED灯
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一) springboot详细介绍
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .bat文件调用java类的main方法
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net FrameWork总结
  • .net SqlSugarHelper
  • .NET6实现破解Modbus poll点表配置文件
  • .NET多线程执行函数
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /tmp目录下出现system-private文件夹解决方法
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Validated和@Valid校验参数区别
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Android]使用Retrofit进行网络请求
  • [C/C++] -- 二叉树