1. 箭头操作符
C++为包含点引用操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->)。
点操作符用于获取类类型对象的成员:
item.same_isbn(item2); //item是个类类型对象,same_isbn(Sales_item item)是该对象定义的方法
假如现在有指向Sales_item对象的指针或者迭代器,则在使用点操作符前,需要先对改指针或者迭代器进行解引用:
Sales_item *sp=&item1; (*sp).same_isbn(item2); //注意要用括号括起来,因为解引用操作符的优先级低于点操作符
上述代码没有问题,但是容易出错,所以C++定义的箭头操作符。
上述代码可以直接这么写:
Sales_item *sp=&item1; sp->same_isbn(item2);
放道习题:
假设iter为 vector<string>::iterator 类型的变量,指出下面哪些表达式是合适的?并解释这些合法表达式的行为。
(a) *iter++; (b) (*iter)++; (c) *iter.empty();
(d) iter->empty(); (e) ++*iter; (f) iter++->empty();
解答:
(a)是合法的,后自增操作符的优先级要高于解引用操作符,但是要注意的是如果有返回的值,返回的对象是迭代器增加前指向的对象而不是增加后指向的对象,虽然后自增先执行。
(c)是非法的,点操作符的优先级高于解引用操作符(点操作符的优先级很高啊...)。
(d)是合法的,这就是上面所说的内容,意思是调用iter所指向的对象的empty()方法。
(e)是非法的,前自增操作符的优先级等于解引用,所以遵循从左至右的顺序,所以如果是*++iter就对了。
(f)是合法的,先执行和(d)一样的操作,完了以后iter加1。
2. 条件操作符
条件操作符是C++中唯一的三元操作符。这里就说明它的一个用途:使用嵌套的条件操作符求出三个变量的最大值,并将最大值赋值给max.
int main(){ int a=7,b=9,c=8; int max=a>b?a>c?a:c:b>c?b:c; cout<<max<<endl; return 0; }
3. sizeof操作符
sizeof操作符的作用是返回一个对象或类型名的长度,单位是字节。
·对char类型或者值为char类型的表达式做sizeof操作保证得1。
·对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小。
·对指针做sizeof操作将返回存放指针所需要的内存大小;注意:如果要获取该指针所指向的对象的大小,则必须对该指针进行解引用。
·对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。因为sizeof返回整个数组在内存的存储长度,所以用sizeof数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数。
int x[10]; int *p=x; cout<<sizeof(x)/sizeof(*x)<<endl; //10 cout<<sizeof(p)/sizeof(*p)<<endl; //1
关于对类对象调用sizeof操作符。
Sales_item item; int a=sizeof(item); cout<<a<<endl; //a=16
完了。