c++左值和右值、 左值引用与右值引用

c++ 左值引用与右值引用——原

左值和右值

综述

C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:

可以取地址的,有名字的,非临时的就是左值;——变量、返回引用、const
不能取地址的,没有名字的,临时的就是右值;——10、函数返回值

数(10),函数返回的值(.没名字、临时值)等都是右值;
而非匿名对象(包括变量),函数返回的引用,const对象等都是左值。

详细

1、左值指既能够出现在等号左边,也能出现在等号右边的变量;
右值则是只能出现在等号右边的变量。

int a; // a 为左值
a = 3; // 3 为右值

2、左值是可寻址的变量,有持久性;
右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。

3、值和右值主要的区别之一是左值可以被修改,而右值不能。

左值引用和右值引用

传统左值引用

int a = 10;
int &b = a;  // 定义一个左值引用变量
b = 20;      // 通过左值引用修改引用内存的值

右值引用

正常情况下只能操作 C++ 中的左值,无法对右值添加引用

int num = 10;
int &b = num; //正确
int &c = 10;//错误

因为10无法进行取地址操作,无法对一个字面值常量取地址。

C++ 11 特性:右值引用

定义右值引用的格式如下:

只能绑定到一个将要销毁的对象,如果之后要用到它,避免了内存的拷贝,获得这个对象的所有权。

类型 && 引用名 = 右值表达式;
int num = 10;
//int && a = num;  //右值引用不能初始化为左值
int && a = 10;
#include <iostream>
#include <string>

using namespace std;

string getMyName()
{
	string name = "TM";
	return name;
}

string printStr(string& str)
{
	if (str.empty())
	{
		return str;
	}

	cout << str;
	return str;
}

int main()
{
	printStr(getMyName());//非常量引用的初始值必须为左值

	//tring name = getMyName();
	//printStr(name);
	
	system("pause");
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值