重载
重载运算符时可以重载运算对象的类型和返回值类型,但是不能重载运算对象的个数和优先级以及结合律,这些是无法改变的
左值和右值
左值可放在赋值语句的坐侧,右值则不能。当一个对象被当作左值的时候用的是对象的身份(内存中的位置),当对象被用作右值的时候用的是对象的值(内容)
原则:用右值的地方可以用左值来替代,但是不能用右值来替代左值使用,当左值被当成右值使用时,实际使用的是它的内容(值)
用左值的运算符:
1 赋值运算符左侧的运算对象,得到的结果仍然是一个左值
2 取地址符作用一个左值运算对象,返回指向该运算对象的指针,这个指针是右值
3内置解引用运算符,下标运算符,迭代器的解引用运算符,string和vector的下标运算符的求值结果都是左值
4 内置类型和迭代器类型的自增自检运算符作用于左值运算对象,所得的结果也是左值
算术运算符
优先级:(+ -正负号)> (* / %乘除求余) > (+ -加减法)
满足左结合律,意味着当优先级相同按照从左向右的顺序结合
算术运算符都能作用于任意算术类型以及任意能转换为算数类型的类型。
算数运算符的运算对象和求值结果都是右值
参与求余运算的对象必须是整数类型
逻辑和关系运算符
优先级:(!) >(< <= > >=)>(== !=)>(&&)>(||)
关系运算符作用于算术类型或指针类型,逻辑运算符作用于任意能转换成布尔值的类型。逻辑运算符和关系运算符的返回值都是布尔类型
运算对象和求值结果都是右值
赋值运算符
赋值运算符的左侧运算对象必须是一个可修改的左值
算术运算符>关系运算符>逻辑运算符>赋值运算符
递增和递减运算符必须作用于左值运算对象,前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。
后置递增运算符的优先级高于解引用运算符
条件运算符的优先级较低
位运算符作用于整数类型的运算对象
sizeof运算符
返回值是一个无符号类型的常量表达式,所以它的结果可以声明数组的维度
sizeof并不实际计算其运算对象的值,所以在sizeof的运算对象中解引用一个无效指针任然是一种安全行为,因为指针实际上并没有被真正使用,sizeof不需要真的解引用指针也能知道它所指对象的类型
sizeof运算符的结果部分地依赖于其作用的类型:
1 对char或者类型为char的表达式执行sizeof运算,结果得1
2 对引用类型执行sizeof运算得到被引用对象所占空间的大小
3 对指针执行sizeof运算得到指针本身所占控件的大小
4 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需要有效
5 对数组执行sizeof运算得到整个数组所占控件的大小,等价于对数组中所有的元素个执行一次sizeof运算并将所得的 结果求和,注意!sizeof运算不会把数组转换成指针来处理。
6 对string对象或者vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间