C++右值引用
右值引用是C++11标准引入的一个技术。
与左值引用类似,右值引用的是右值,包括常量、临时值等不可作为左值的值,使用&&表示右值引用,如:type &&t = value1+value2;,在标准库的头文件<uility>有std::move()函数返回对应的右值类型。如果是const 左值引用类型,则同样可以接收右值。
右值的应用不少,下面以一个简单的字符串存储类介绍其中的移动构造函数、移动赋值函数:
//a.h#ifndefA_H#defineA_H#include<iostream>#include<cstring>usingstd::cout;usingstd::endl;classA{public:A();//默认构造函数A(constchar*str);//构造函数A(A&&a);//移动构造函数A&&operator=(A&&a);//移动赋值函数~A();//析构函数voidprint();//输出mStrprivate:intmLength;char*mStr;};#endif
//a.cpp#include"a.h"A::A(){mLength=0;mStr=nullptr;}A::A(constchar*str){if(str!=nullptr){//分配资源mLength=strlen(str);mStr=newchar[mLength+1];strcpy(mStr,str);}else{A();}}A::A(A&&a){//获取a的资源cout<<"A(&&)"<<endl;mLength=a.mLength;mStr=a.mStr;//将a的mStr设为nullptr,防止a销毁时释放内存a.mStra.mStr=nullptr;a.mLength=0;}A&&A::operator=(A&&a){cout<<"operator=(A&&)"<<endl;if(mStr!=nullptr){delete[]mStr;mStr=nullptr;}//获取右值a的资源mStr=a.mStr;mLength=0;//防止右值a销毁时释放mStr的资源a.mStr=nullptr;a.mLength=0;//使用std::move()返回右值引用类型returnstd::move(*this);}A::~A(){if(mStr!=nullptr){delete[]mStr;}}voidA::print(){cout<<mStr<<endl;}
//main.cpp#include<iostream>#include"A.h"usingstd::cout;usingstd::ends;intmain(){Astr1("asd");//拷贝构造函数str1.print();str1="123";//移动赋值函数str1.print();Astr2(A("zmh"));//移动构造函数str2.print();return0;}
输出:
asd
operator =(A&&)
123
zmh
使用右值引用时,要防止右值销毁而使获取的资源无效。
以上是对右值引用的简单介绍,欢迎大家一起交流讨论。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。