7引用-右值引用-引用结合const和指针

发布时间 2024-01-11 23:11:10作者: 二氧化硅21

引用

引用和指针的区别

  • 引用是一种更安全的指针。

  • 引用必须初始化,指针可以不初始化。引用初始化为另一个同类变量,特殊情况下可初始化为常量。

  • 引用只有一级,没有多级引用。

  • 从汇编指令层面看。对引用的处理,是采用指针的方法。因为引用是一种const指针。通过引用变量修改所引用内存的值,与通过指针解引用修改指针指向内存的值,二者的底层指令也是一样的。

  • 数组如何被引用?

    int a;
    int *b = &a;
    int &b = a;
    
    int array[5];
    int (*p)[5] = &array
    int (&p)[5] = array
    
  • 引用虽然本质是指针,但使用时,总是要先进行解引用,因此进行sizeof运算,依然为所引用变量的字节数。

左值引用和右值引用

  • 左值:有内存,有名字,值是可以修改的。
  • 右值:反之。
  • C++11提供了右值引用:右值引用也必须立即进行初始化操作,且只能使用右值进行初始化。右值引用可以修改右值。
    • 右值引用专门引用右值,不能引用左值。
    • 右值引用变量本身是一个左值,只能用左值引用引用它。
    • 指令上,自动产生临时量,然后直接引用临时量。
      //一般情况下,C++只允许左值引用,而不允许右值引用
      int num = 10;
      const int &b = num; //正确
      const int &c = 10;  //错误
      
      //右值引用
      int num = 10;
      //int && a = num;  //右值引用不能初始化为左值
      int && a = 10;  //指令层面,临时量xx=20,然后a引用xx
      a = 11; //右值引用可以修改右值
      

左值引用和右值引用总结

const,一级指针,引用的结合使用

为了观察赋值是否可行,可以先将引用换成指针的写法:引用号&修改为*,等式右侧加上取地址符&,然后比较等式两边的类型是否符合赋值规范。video

int main()
{
    //int& p = 10 //错误
    const int& p = 10; //正确,产生临时量,p是临时量的引用
    int* const& q = (int*)0x0018ff44; //q是const修饰的int指针,不能写成const int* &q
}
int main()
{
    int a = 1;
    int* p = &a;
    const int *& q = p; 
    //相当于const int ** q = &p; const int **和int **不能相互赋值。
    return 0;
}