箭头操作符

来源:互联网 发布:慈心渡鬼软件 编辑:程序博客网 时间:2024/05/18 08:28

C++语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->).点操作符用于获取类类型对象的成员:

item1.same_isbn(item2); //run the same_isbn member of item1

如果有一个指向Sales_item对象的指针(或迭代器),则在使用点操作符前,需对该指针(或迭代器)进行解引用:

Sales_item *sp=&item1;
(*sp).same_isbn(item2); //run same_isbn on object to which sp points

这里,对sp进行解引用以获得指定的Sales_item对象.然后使用点操作符调用指定对象的same_isbn成员函数.在上述用法中,注意必须用圆括号把解引用括起来,因为解引用的优先级低于点操作符.如果漏掉圆括号,则这段代码的含义就完全不同了:

// run the same_isbn member of sp then dereference the result!
*sp.same_isbn(item2); //error:sp has no member named same_isbn

这个表达式企图获得sp对象的same_isbn成员.等价于:

*(sp.same_isbn(item2));  //equivalent to *sp.same_isbn(item2);

然后,sp是一个没有成员的指针;这段代码无法通过编译.

因为编程时很容易忘记圆括号,而且这类代码又经常使用,所以C++为在点操作符后使用的解引用操作定义了一个同义词:箭头操作符(->).假设有一个指向类类型对象的指针(或迭代器),下面的表达式互相等价:

(*p).foo;  //dereference p to get an object and fetch its member named foo
p->foo;    //equivalent way to fetch the foo from the object to which p points

具体地,可将same_isbn的调用重写为:

sp->same_isbn(item2);  //equivalent to (*sp).same_isbn(item2)

习题 5.18  编写程序定义一个vector对象,其每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容极其相应的长度.

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
 vector<string*> svec;
 //读取vector对象
 string str;
 cout<<"Enter some strings(Ctrl+Z to end)"<<endl;
 while(cin>>str){
  string *pstr=new string;//指向string对象的指针
  *pstr=str;
  spvec.push_back(pstr);
 }
 //输出每个string的内容极其相应的长度
 vector<string*>::iterator iter=spvec.begin();
 while(iter!=spvec.end()){
  cout<<**iter<<(**iter).size()<<endl;
  iter++;
 }
 //释放各个动态分配的string对象
 iter=spvec.begin();
 while (iter!=spvec.end())
 {
  delete *iter;
  iter++;
 }
 return 0;
}

习题5.19  假设iter为vector<string>::iterator类型的变量,指出下面哪些表达式是合法的,并解释这些合法表达式的行为.

a.*iter++;
b.(*iter)++;
c.*iter.empty();
d.iter->empty();
e.++*iter;
f.iter++->empty();

a返回iter所指向string对象,并使iter加1.
d调用iter所指向的string对象的成员函数empty.
f调用iter所指向的string对象的成员函数empty,并使iter加1

原创粉丝点击