//神奇的左值右值,之前完全没印象啊
左值——既能出现在等号左边,同时可以出现在等号右边的表达式/变量。
右值——只能出现在等号右边的表达式/变量。
对于C语言来说, 左值就是在程序中能够寻值的东西,右值就是没法取到它的地址的东西。但是这个概念上升到C++的时候就会稍有不同——在C++中,每一个表达式都会产生一个左值或者右值,相应的,该表达式也就被称为
“左值表达式”,或者“右值表达式”。
对于基本数据类型来说,C和C++的左值右值并没有太多的区别——右值不能被修改,也不能被const或者volatile所修饰。但对于自定义类型,就有非常神奇的差别:C++的自定义类型,右值允许它的成员函数进行修改。例:
class cs
{
public:
cs(int i): i_(i) { cout << "cs(" << i <<") constructor!" << endl; }
~cs() { cout << "cs destructor,i(" << i_ << ")" << endl; }
cs& operator=(const cs& other)
{
i_ = other.i_;
cout << "cs operator=()" << endl;
return *this;
}
int get_i() const { return i_; }
void change(int i) { i_ = i; }
private:
int i_;
};
cs get_cs()
{
static int i = 0;
return cs(i++);
}
int main()
{
// 合法
(get_cs() = cs(2)).change(323);
get_cs() = cs(2);// operator=()
get_cs().change(32);
return 0;
}
目前学习的还比较肤浅,书上关于左值右值的讨论也较少,先把基本概念介绍到这里,深入部分,日后补充。