右值和左值

[TOC]

右值和左值

右值左值的区分

  1. 能取地址的是左值,不能取地址的是右值

  2. 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    int main()
    {
    //左值
    int lvalue=244;
    //左值引用
    int &lvalueCite=lvalue;
    //右值
    //右值引用
    int &&rvalueCite=6;
    }
  3. 使用右值引用延长生命周期

移动构造函数

  1. 作用: 复用其他对象的资源(堆内存)

  2. 实现浅拷贝

    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/右值和左值/
Author
August Rosenberg
Posted on
March 26, 2023
Licensed under