C++ 表达式基础知识(左值、右值未掌握)

表达式由一个或多个运算对象组成,对表达式求值将会得到一个结果。字面值和变量是最简单的表达式。

重载运算符:当运算符作用于类类型的运算对象的时候,用户可以自行定义其含义。

重载运算符时,包括运算对象的类型和返回值的类型,都是由该运算符定义的,但是运算对象的个数、运算符的优先级和结合律都是无法改变的

对于那些没有指定运算顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。所以书中给予一条建议:如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。(有一个重要例外:当改变运算对象的表达是本身就是另外一个字表达式的运算对象时该规则无效。例:*++iter)


C++中的表达式要不然是右值,要不然就是左值。一个左值表达式求值的结果是一个对象或一个函数。

其中,左值是可以位于赋值语句左侧的表达式,而右值不能这句话是错误的,因为在C++中以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象。

个人以为暂且可以这么记忆,只要可以出现在赋值语句左侧的表达式,就是一个左值表达式

当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)

在需要右值的地方可以用左值来代替,但是不能把右值当作左值。

另外,使用关键字decltype的时候,如果表达式的求值结果是左值,则decltype作用于该表达式(不是变量)得到一个引用类型。(目前暂且死记吧)

书中的例子:

定义一个指向int类型的指针p,因为解引用运算符生成左值,所以decltype(*p)的结果是int&;而取地址运算符生成右值,所以decltype(&p)的结果是int**,即一个指向整型指针的指针。

写下总结之后,发现自己还是不懂左值和右值,暂且不纠结了,等通读一遍C++Primer之后再回过头来看吧。


你可能感兴趣的:(C++Primer学习笔记)