箭头操作符和点操作符

baolishicool 2009-12-03 07:32:03
看了c++ 《primer 4th edition》 关于箭头和点操作符的用法。
说箭头操作符用在指针身上,点操作符是用在对象身上。
但是他的书本上的以下实例中却这样用: (*beg)->remMsg(this); 文中的beg是迭代器,迭代器本身应该就是个指针!那么解引用后就是对象了!这时应该用(*beg).remMsg(this); 或者beg->remMsg(this)才对吧?会不会是书本的实例错了呢?还是我理解上有错误呢?请大家指教!

-------------------------------------以下是课本正文-----------------------
The remove_Msg_from_Folders Member
The implementation of the remove_Msg_from_Folders function is similar to that of put_Msg_in_Folders, except that this time we'll call remMsg to remove this Message from each Folder pointed to by folders:

// remove this Message from corresponding Folders
void Message::remove_Msg_from_Folders()
{
// remove this message from corresponding folders
for(std::set<Folder*>::const_iterator beg =
folders.begin (); beg != folders.end (); ++beg)
(*beg)->remMsg(this); // *beg points to a Folder
}


-----------------------------------------------------------------------
...全文
232 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baolishicool 2009-12-03
  • 打赏
  • 举报
回复
谢谢各位!
蜗牛大锅锅 2009-12-03
  • 打赏
  • 举报
回复
#include <set>
#include <iostream>

using namespace std;

struct Data
{
Data(int id): m_Id(id)
{
}
int m_Id;
};

typedef set<Data *> DataSet;

void main()
{
DataSet dset;
Data d1(1);
Data d2(2);

// dset存储的是Data *类型
dset.insert(&d1);
dset.insert(&d2);

// 迭代器取出来的是存储的数据Data *类型
DataSet::iterator it = dset.begin();
cout << ((*it)->m_Id) << endl;
Data *tmp = *it;
cout << (tmp->m_Id) << endl;
}

迭代器指向的是存储进去的数据的类型Folder*类型,访问Folder*当然要用指针拉
baolishicool 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sduxiaoxiang 的回复:]
*beg的内容是Folder*吧
还是指针
[/Quote]
====================================
哦!我明白了!但是访问static成员为什么却可以把箭头操作符用在对象上?

Using a Class static Member
A static member can be invoked directly from the class using the scope operator or indirectly through an object, reference, or pointer to an object of its class type.

Account ac1;
Account *ac2 = &ac1;
// equivalent ways to call the static member rate function
double rate;
rate = ac1.rate(); // through an Account object or reference
rate = ac2->rate(); // through a pointer to an Account object
rate = Account::rate(); // directly from the class using the scope operator

Lstyk 2009-12-03
  • 打赏
  • 举报
回复
folders的成员本来就是指针啊,

std::set <Folder*>::const_iterator beg = folders.begin ()

迭代器解引用后是set "folders"的成员,它的成员是Folder *类型的
fox000002 2009-12-03
  • 打赏
  • 举报
回复
可以理解为

beg --> Folder**

*beg --> Floder*

*beg 取得的是容器装里的类型,而其类型是 Floder *
macrojj 2009-12-03
  • 打赏
  • 举报
回复
迭代器解引用 然后就是容器的元素 在这里是Folder*
所以用->
没有问题
sduxiaoxiang 2009-12-03
  • 打赏
  • 举报
回复
*beg的内容是Folder*吧
还是指针

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧