左值引用和右值引用

左值引用和右值引用

  • 左值引用:int&
  • 右值引用:int&&

左值和右值的区别:

在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。
左值一定在内存中,右值有可能在内存中也有可能在寄存器中。

区别

我没测试之前,就迷迷糊糊的,测试之后就更迷了。不过可以得到如下结论,欢迎大家解释原因哈。

使用时的区别

  • 用起来就是一个用“&”,一个用“&&”
  • 左值引用一定是左值,int& d=5;是不可以的,因为5是右值,5并没有名字,在使用它之前我们不能通过名字来找到它;
  • 右值引用一定是右值,int && c=a;也是不可以的,因为a是一个已经分配了内存的变量,a有名字,是一个左值。
  • 右值引用并不是不能修改,比如,int&& c=3;c++;就是可以的,结果c=4;

传参时的区别

  • 传递参数的时候,如果输入的是一个数字,则会匹配右值引用的函数,比如test(1),会匹配test(int&& x),因为1是一个没有名字的变量;除此之外,全部会匹配test(int& x);私以为,其他的虽然是引用别的左值或右值,但是他们都有名字了,所以就会被当做左值。
  • test03(int&& x)不能接受除纯数字之外的其他参数,只能test03(1),什么test03(a),test03(b)都不行,因为他们都有名字。
  • test02(int& x)不能接受纯数字,只要是变量名就接受
  • test01(int x)可以接受以上所有,既可以接受纯数字,也可以接受a、b、c这些变量名。

代码输出如下:
左值右值引用测试结果
测试代码如下:

#include<iostream>
using namespace std;
int test(int & x) {//左值引用
	cout << "左值引用x=" << x << endl;
	return 0;
}
int test(int && x) {//右值引用
	cout << "右值引用x=" << x << endl;
	return 0;
}
void test01(int x) {//传入左值右值引用和数字均可
	cout << "test01直接传参x=" << x << endl;
}
void test02(int &x) {//传入有名字的变量,不能传入数字
	cout << "test02左值引用x=" << x << endl;
}
void test03(int &&x) {//只能传入数字
	cout << "test03右值引用x=" << x << endl;
}
int main() {
	int a = 2;
	int & b = a;//左值引用
	//int && c = a;//编译报错:无法将“int”转化为“int&&”,不能将左值引用转化为右值引用
	int && c = 3;//右值引用
	//int & d = 5;//编译错误
	c++;
	//int & d = 4;//编译报错:无法将“int”转换为“int&”,非常量的初始化必须为左值
	printf("int a = 2;\nint & b = a;\nint && c = 3;\n");
	printf("a=%d,b=%d,c=%d\n", a, b, c);
	test(1);
	test(a);
	test(b);
	test(c);
	cout << "=================== 测试 1 =====================" << endl;
	test01(1);
	//test02(1);//编译错误
	test03(1);
	cout << "=================== 测试 a =====================" << endl;
	test01(a);
	test02(a);
	//test03(a);//编译错误
	cout << "=================== 测试 b =====================" << endl;
	test01(b);
	test02(b);
	//test03(b);//编译错误
	cout << "=================== 测试 c =====================" << endl;
	test01(c);
	test02(c);
	//test03(c);//编译错误
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值