点操作符用于获取类类型对象的成员:
Sales_item item1;
item1.same_isbn(item2);
若是有一个指向item1对象的指针:
Sales_item *sp=&item1;
则必须要先解引用,才能使用点操作符:
(*sp).same_isbn(item2);
并且括号是不能省略的,因为解引用的优先级要大于点操作。
由于编程很容易忘记括号,而这类代码要经常使用,所以C++为在点操作符后使用的解引用操作定义了一个同义词:箭头操作符(->):
sp->same_isbn(item2);//等价于(*sp).same_isbn(item2); sizeof
语法形式:
sizeof(type name);
sizeof(expr);
sizeof expr;
将sizeof用于expr时,并没有计算表达式的值,故sizeof *p中,p可指向无效地址,因为p不需被解析。
对char 类型或值为char类型的表达式做sizeof操作,得1
对引用类型做sizeof操作将返回存放引用类型的所需空间大小
对指针做sizeof操作将返回存放指针所需内存大小,如果要获取该指针所指向的对象大小,则必须解引用。
对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上元素个数。因为sizeof返回整个数组在内存中的存储长度,所以用sizeof数组的结果除以sizeof其元素类型为数组元素个数。int sz=sizeof(ia)/sizeof(*ia);
操作符优先级及结合顺序
操作符 | 结合顺序 | 功能 | 用法 |
:: :: :: |
左 | 全局作用域 类作用域 名字空间作用域 |
::name class::name namespace::name |
. -> [] () () |
左 |
成员选择 成员选择 下标 函数调用 类型构造 |
object.member pointer->member variable[expr] name(expr) type(expr_list) |
++ -- typeid typeid 显示类型转换 |
右 |
后自增 后自减 类型ID 运行时类型ID 类型转换 |
lvalue++ lvalue-- typeid(type) typeid(expr) cast_name<type>(expr) |
sizeof |
右 | 对象大小 类型大小 前自增 前自减 位求反 逻辑非 一元负号 一元正号 解引用 取地址 类型转换 创建对象 释放对象 释放数组 |
sizeof expr sizeof(type) ++lvalue --lvalue ~expr !expr -expr +expr &expr (type)expr new type delete expr delete [] expr |
->* .* |
左 |
指向成员操作的指针 指向成员操作的指针 |
ptr->*ptr_to_member obj.*ptr_to_member |
* / % |
左 | 乘 除 求模 |
expr*expr expr/expr expr%expr |
+ _ |
左 |
加 减 |
expr+expr expr-expr |
<< >> |
左 |
位左移 位右移 |
expr<<expr expr>>expr |
< <= > >= |
左 |
小于 小于等于 大于 大于等于 |
expr<expr expr<=expr expr>expr expr>=expr |
== != |
左 |
相等 不相等 |
expr==expr expr!=expr |
& | 左 | 位与 | expr&expr |
^ | 左 | 位异或 |
expr^expr |
| | 左 | 位或 | expr|expr |
&& |
左 | 逻辑与 |
expr&&expr |
|| |
左 | 逻辑或 |
expr||expr |
?: |
右 | 条作操作 |
expr?expr:expr |
= *=,/=,%=,+=,-=,<<=, >>=,&=,|=,^= |
右 | 赋值操作 复合赋值操作 |
lvalue=expr lvalue+=expr 等等 |
throw |
右 | 抛出异常 | throw expr |
, | 左 | 逗号 | expr,expr |