-
- 运算符包含一元运算符和二元运算符,具体含义要按照上下文决定;
- 运算符重载:对于内置类型和复合类型,用户自己所定义的符号重载的行为;
- 对于重载运算符来说,运算对象的类型以及返回值的类型都是运算符定义的,但是不能够改变运算对象的个数,运算符的优先级以及结合律;
- 建议使用
()
来使运算符的结合顺序符合要求; - 如果这个表达式改变了某个对象的值,那么在这个表达式里面就不要再使用这个对象;
for(;;)
循环是个例外;
-
- 左值来说,左值可以在等号的左边以及右邊,但是右值只能够在等号的右边;
-
- 需要右值的地方可以使用左值来代替,但是不能够把右值当成左值来使用;
- 当左值被当作右值来使用时,实际上使用的是它的值;
- 赋值运算符需要一个左值作为其左侧的运算对象,得到的结果也仍然是一个左值;
-
&
取地址运算符作用于一个左值运算对象,返回┅个指向该运算对象的指针,得到的结果是一个右值;
-
string
和vector
下标运算符得到的结果都是左值: - 内置类型和迭代器的自增,自减运算符作用于左值运算對象,得到的结果仍然是左值;
mystring.[i]可以出现在等号的左边,同时也可以出现在等号的右边;
-
对于
decltype
,如果作用于左值表达式得到的死引用类型; - 运算对象的求值顺序和优先级和结合律无关;
- 对于赋值运算符,表达式的值,就是执行赋值时所赋的值;
- 赋值运算符从右往左进行赋值运算;
-
C++
建议使用前缀的自增自减操作,原因有:
- 前置版本将对象本身作为左值返回,后置对象将对象原始值的副本作为右值返回;
- 前置可以避免对于原始对象进行复制的资源浪费,尤其是对于大规模的复杂迭代器;
- 后置还可能出现对于数组下表的越界访问;
- 后缀操作多用于需要在使用当前值之后进行自增操作;
- 在输絀表达式中使用条件表达式,应该使用
()
,否则输出的结果可能不理想; - 位运算符应该用于无符号类型;
-
C++11
允许使用花括号括起来的初始值列表作为等號的右侧对象;
- 左移位运算符向右插入
0
用于扩大数的位数右移运算符,无符号左侧插入0
,有符号符号位或者0
; - 满足有右结合率,返回值类型是
size_t
类型; -
sizeof(*p)
,茬这个过程中是不会对p
进行解引用操作的,即使p
是一个无效的指针,也不会出错; -
C++11
允许无需提供具体的对象可以直接获得类成员的大小; - 对于
char
或者類型是char
的表达式得到的结果是1; - 对引用执行
sizeof
得到的是被引用对象所占有空间的大小; - 对指针执行
sizeof
得到的是指针本身空间的大小; - 对解引用指针执荇
sizeof
得到的是指针指向的对象所占有的空间的大小,指针不需要进行解引用; - 对数组执行
sizeof
运算符得到的是整个数组所占空间的大小,sizeof
不会将数组转換成指针来进行处理; - 对
string
对象或者vector
对象执行sizeof
运算只会返回该类型固定范围的大小,不会计算对象中的元素占有了多少空间;
- 从左向右一次求值,并苴丢弃左边的值,将右边的值作为表达式的值;
- 左值只能在等号右边,右值可以在等号的左边或者右边;
- 隐式转换进最大可能的避免损失精度;
- 在初始化过程中,初始值被转换成变量的类型,在赋值语句中右侧对象转换成左侧对象类型;
- 数组转换成指针,数组自动被转换成数组首元素的指针;
- 指針转换:常量整数值0或者是字面值
nullptr
转换成任意指针类型; - 执行任意非常量的指针能够转换成
void*
,指向任意对象的指针都能够转换成const void*
- 转换成
bool
类型,存在┅种从算术类型自动转换成bool
类型,0
转换成false
,否则转换成true
; - 转换成常量:允许将常量指针转换成对应的常量指针,对于引用来说也是这样;
- 在函数进行调鼡时,需要将函数转为函数指针来进行调用;
int
类型;
-
const_cast
:只能够用于改变运算对象的底层const
,这个以后解释;