4.1 左值和右值

//神奇的左值右值,之前完全没印象啊
 
左值——既能出现在等号左边,同时可以出现在等号右边的表达式/变量。
右值——只能出现在等号右边的表达式/变量。
 
对于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;
}
 
目前学习的还比较肤浅,书上关于左值右值的讨论也较少,先把基本概念介绍到这里,深入部分,日后补充。
 
 

猜你喜欢

转载自www.cnblogs.com/NK-007/p/9172822.html
今日推荐