箭头操作符

本文详细介绍了C++中的箭头操作符(->)及其与点操作符的使用区别,通过实例演示如何在指针和迭代器上应用箭头操作符来访问类成员,并提供了相关练习题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值