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;
}

引用是一种更安全的指针

  1. 引用必须初始化,指针可以不初始化
  2. 引用只有一级引用,没有多级引用
  3. 定义一个引用变量,和定义一个指针变量,其汇编指令是一模一样的,通过引用变量修改引用内存的值,和通过指针解引用修改指针指向的内存的值,其底层指令也是一模一样的
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;
    • 右值引用变量本身是一个左值,只能用左值引用来引用它
    • 不能用一个右值引用变量,来引用一个左值
posted @ 2022-08-26 16:30  言叶以上  阅读(18)  评论(0编辑  收藏  举报