右值和左值
[TOC]
右值和左值
右值左值的区分
能取地址的是左值,不能取地址的是右值
实例
1
2
3
4
5
6
7
8
9
10
11
int main()
{
//左值
int lvalue=244;
//左值引用
int &lvalueCite=lvalue;
//右值
//右值引用
int &&rvalueCite=6;
}使用右值引用延长生命周期
移动构造函数
作用: 复用其他对象的资源(堆内存)
实现浅拷贝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#include "iostream"
class name1 {
public:
//无参构造
name1(){
mPtr=new int;
}
//拷贝构造
name1(const name1 &tem){
this->mPtr=tem.mPtr;
}
//移动构造
name1(name1&& tem):mPtr(tem.mPtr)
{
tem.mPtr=nullptr;
}
public:
int * mPtr;
};
name1 getObj(){
name1 name11;
*name11.mPtr=2;
std::cout<<name11.mPtr<<std::endl;
return name11;
}
int main()
{
//要求右侧是个临时对象,才会调用移动拷贝构造函数
//如果没有移动拷贝构造函数,就会调用拷贝构造函数
name1 obj=getObj();
std::cout<<obj.mPtr<<" "<<*obj.mPtr<<std::endl;
name1&& obj2=getObj();
std::cout<<obj2.mPtr<<" "<<*obj2.mPtr<<std::endl;
return 0;
}
move
使用std::move方法可以将左值转换为右值。使用这个函数并不能移动任何东西,而是和移动构造函数一样都具有移动语义,将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。
forward
右值引用类型是独立于值的,一个右值引用作为函数参数的形参时,在函数内部转发该参数给内部其他函数时,它就变成一个左值,并不是原来的类型了。如果需要按照参数原来的类型转发到另一个函数,可以使用 C++11 提供的 std::forward () 函数,该函数实现的功能称之为完美转发。
右值和左值
https://tsy244.github.io/2023/03/26/cpp/右值和左值/