4.1.1基本概念
c++ 定义了多种运算符,其中包括一元运算符,二元运算符,三元运算符。作用于一个运算对象的运算符即是一元运算符,作用于两个运算对象的运算符即是二元运算符。要特别注意,函数调用也是一种特殊的运算符,它对运算对象的数量没有限制。
要理解运算符,首先要理解运算符的优先级、结合律以及运算对象的求值顺序。
重载运算符
重载运算符时,必须要有一个运算对象是自定义类型,而且重载运算符不会改变运算符的运算对象个数,运算符的优先级和结合律。
左值和右值
左值和右值是一个很难理解的概念。最初在c语言中,左值表示可以位于赋值语句左侧的值,但右值则不能。在C++中,两者的区别则没有那么简单。可以做一个简单的归纳:当一个对象被用作右值时,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。当一个表达式,可以对其取址时,它则可以作为一个左值。
不同运算符对运算对象的要求各不相同,有的需要左值运算对象,有的需要右值运算对象。返回值也不相同,有的返回左值结果,有的返回右值结果。一个重要的原则是:在需要右值的地方,可以使用左值来代替,但是不能把右值当做左值来使用。当一个左值被当做右值使用时,实际使用的是它的内容。
4.1.2优先级和结合律
略
4.1.3求值顺序
优先级规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值,比如:
a = (expr1) + (expr2);
我们无法判断是expr1表达式先求值还是expr2表达式先求值。所以这有时可能造成歧义,比如
int i= 0;
a = i + (++i); //若先计算左边,a结果为1,若先计算右边表达式,a结果为2
c++中有四种运算符明确规定了运算对象的求值顺序 && 、|| 、(,)、(?:)。
由于重载操作符会使上述四种操作符失去运算对象的求值顺序,所以通常不应该对上述四种操作符进行重载操作。