成员访问运算符与条件运算符
成员访问运算符
点运算符和箭头运算符都可以用于访问成员,其中,点运算符获取类对象的一个成员,箭头运算符与点运算符有关。
string s1 = “a string”,*p = &s1;
auto n = s1.size();
n = (*p).size;
n = p->size();
因为解引用运算符的优先级低于点运算符,所以解引用运算的子表达式两端必须加上括号,若是没有括号,代码的意义就大不相同:
*p.size; //p是一个指针,它没有名为size的成员。
条件操作符
条件操作符是 C++ 中唯一的三元操作符,它允许将简单的 if-else 判断语句嵌入表达式中。条件操作符的语法格式为:
cond ? expr1 : expr2;
其中,cond 是一个条件判断表达式(第 1.4.1 节)。条件操作符首先计算cond 的值,如果 cond 的值为 0,则条件为 false;如果 cond 非 0,则条件为 true。 无论如何, cond 总是要被计算的。 然后, 条件为 true 时计算 expr1 ,否则计算 expr2 。
避免条件操作符的深度嵌套
可以使用一组嵌套的条件操作符求出三个变量的最大值,并将最大值赋给max:
int max = i > j
? i > k ? i : k
: j > k ? j : k
在输出表达式中使用条件操作符
经常使用条件操作符根据一定的条件输出一个或另一个值,在输出表达式中,如果不严格使用圆括号将条件操作符括起来,将会得到意外的结果:
cout << (i < j ? i : j); // 打印i和j中的较大值
cout << (i < j) ? i : j; // 输出1或者0
cout << i < j ? i : j; // 错误,试图比较cout和i
第二个表达式比较有趣:它将 i 和 j 的比较结果视为 << 操作符的操作数,输出 1 或 0。 << 操作符返回 cout 值,然后将返回结果作为条件操作符的判断条件。也就是,第二个表达式等效于:
cout << (i < j); // prints 1 or 0
cout ? i : j; // test cout and then evaluate i or j
// depending on whether cout evaluates to true or false