點運算符和箭頭運算符都可以用於訪問成員,其中,點運算符獲取類對象的一個成員;箭頭運算符與點運算符有關
ptr->mem 等價於 (*ptr).men
string s1 = "a string", *p = &s1; auto n = s1.size(); n = (*p).size(); n = p->size();
因為解引用運算符的優先級低於點運算符,所以執行解引用運算的子表達式兩端必須加上括號。如果沒有括號,代碼的含義就大不相同了
箭頭運算符作用於一個指針類型的運算對象,結果是一個左值。
點運算符分為兩種情況:如果成員所屬的對象是左值,那么結果是左值,如果成員所屬的對象是右值,那么結果是右值。
// 練習4.20 假設iter的類型是vector<string>::iterator,說明下面的表達式是否合法,如果合法,表達式的含義是什么?如果不合法,錯在何處 // a *iter++; // 合法,先對iter解引用,然后對iter向前遞增。 // b (*iter)++; // 不合法,對iter解引用,然后對解引用的值遞增. // 因為vector<string>中類型為string,令string類型加1不合法 // c *iter.empty(); // 不合法,iter是一個迭代器(指針),沒有empty成員函數 // d iter->empty(); // 合法 // e ++*iter // 不合法,iter是一個迭代器(指針),*iter解引用得到string類型元素,string無法自增 // f iter++->empty(); // 合法,對iter求空后對iter自增
在輸出表達式中使用條件運算符
cout << ((grade < 60) ? "fail" : "pass"); // 輸出pass或者fail cout << (grade < 60) ? "fail" : "pass"; // 如果grade<60輸出1,如果grade>=60輸出0 // cout << (grade < 60); // cout ? "fail" : "pass"; cout << grade < 60 ? "fail" : "pass"; // 錯誤,試圖比較cout和60 // cout << grade; // cout < 60 ? "fail" : "pass";