C++基础-左值引用与右值引用
引用
int main(int argc, char const *argv[])
{
int a = 10;
int *p = &a;
int &b = a;
//int &c = 20; //错误,20无法取地址
*p = 20;
cout<<a<<" "<<*p<<" "<<b<<endl; //20 20 20 同一块内存
b = 30;
cout<<a<<" "<<*p<<" "<<b<<endl;//30 30 30
return 0;
}
引用是一种更安全的指针
- 引用必须初始化,指针可以不初始化
- 引用只有一级引用,没有多级引用
- 定义一个引用变量,和定义一个指针变量,其汇编指令是一模一样的,通过引用变量修改引用内存的值,和通过指针解引用修改指针指向的内存的值,其底层指令也是一模一样的
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
//以下二者没有区别
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int main01(int argc, char const *argv[])
{
int a = 10;
int b = 20;
swap(a,b); //值传递,交换失败
swap(&a,&b); //地址传递,交换成功
swap(a,b); //引用传递,不用自己取地址了,交换成功
return 0;
}
引用和指针的区别?
在汇编指令上是没有任何区别的,在指令上都是通过指针来进行的,定义一个引用变量也是需要把所引用的地址先存下来,通过引用赋值也要先拿到一个所引用的地址,然后通过地址解引用来修改所引用的地址的值,跟指针是一样的。
int main(int argc, char const *argv[])
{
int array[5] = {};
int *p = array;
//引用array数组
int (*q)[5] = array;
cout<<sizeof(array)<<endl; //20
cout<<sizeof(p)<<endl; //4
cout<<sizeof(q)<<endl; //20
return 0;
}
引用通俗来说是它引用内存的别名,sizeof(q) 其实就是 sizeof(array)
使用引用变量时,总是会把底层的地址拿出来做一个解引用操作,所以访问q就是在访问array
初识左值右值引用
int main(int argc, char const *argv[])
{
int a = 10;
int &b = a; //左值:有内存,有名字,值可以修改
//int &c = 20; //右值:没内存,没名字
//C++ 11 提供右值引用
int &&c = 20;
c = 30;
int &e = c; //一个右值引用变量,本身是一个左值,只能用左值引用
//int &&f = c; //错误,此时是右值引用,只能引用右值,此时c已经是左值
/*
int temp = 20;
temp -> d;
*/
const int &d = 20;
// 这种方式可以右值常引用,但是d不能作为左值 ,因为这是常引用
return 0;
}
- 右值引用
int &&c = 20;
专门用来引用右值类型,指令上,可以自动产生临时量,然后直接引用临时量c = 20;
- 右值引用变量本身是一个左值,只能用左值引用来引用它
- 不能用一个右值引用变量,来引用一个左值