C++难点解析之左值和右值
C++ 中根据值的是否有标志和是否可移动特性,可分为左值和右值。C++ 中左值和右值的概念可以说是继承于C语言,在C语言中左值表示可以出现在等号左边也能够出现在等号右边的值,右值则指只能出现在等号右边的值。对于C++中的左值和右值,需要区分基础类型和自定义类型。
- 基础类型的左值和右值的概念基本和C语言相通。
- 对于自定义类型,可以通过非const成员函数更改属性。
- const左值引用会延长右值的生命周期。
对于C++ 中的左值和右值我们需要谨记上面这三点,下面通过几个例子来展示这几个特性。
class ValueCl
{
public:
ValueCl(const int &value) :mValue(value) {};
public:
void SetValue(const int& value) { mValue = value; }
int GetValue() const { return mValue; }
ValueCl& operator+(const ValueCl& v)
{
mValue += v.mValue;
return *this;
}
protected:
int mValue;
};
int main()
{
/*
* 此处体现了可以在自定义类型的右值对象上调用类方法修改右值属性,
* 并且const左值引用可以延长右值的生命周期
*/
ValueCl{ 3 }.SetValue(4);
/*
* 对于这种情况下的右值可以出现在赋值表达式的左侧是因为,
* ValueCl& operator=(const ValueCl& v);的默认赋值运算符的存在。
* 同时可以在右值对象上调用类非const方法
*/
ValueCl{ 1 } + ValueCl{ 2 } = ValueCl{ 3 };
}
仔细理解上面给出的代码,基本可以解决C++中左值和右值全部的迷惑。