點操作符用於獲取類類型對象的成員:
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 |