关于重载运算符->的问题

illuminati 2009-07-30 10:41:41
读c++primer时,发现这样一个问题;原文如下
point->action();
由于优先级规则,它实际等价于编写:

(point->action)();

换句话说,我们想要调用的是对 point->action 求值的结果。编译器这样对该代码进行求值:

如果 point 是一个指针,指向具有名为 action 的成员的类对象,则编译器将代码编译为调用该对象的 action 成员。

否则,如果 action 是定义了 operator-> 操作符的类的一个对象,则 point->action 与 point.operator->()->action 相同。即,执行 point 的 operator->(),然后使用该结果重复这三步。
否则,代码出错。

问题:为什么point->action 与 point.operator->()->action 相同
我感觉应该与point.operator->()action相同。

...全文
114 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2009-07-30
  • 打赏
  • 举报
回复
楼主终于说了句明白话。
[Quote=引用 9 楼 wsllittlebird 的回复:]
难道是编译器就是这么规定的
[/Quote]
pengzhixi 2009-07-30
  • 打赏
  • 举报
回复
Screen *operator->() { return ptr->sp; }
这很正常啊,因为需要的是screen类型的对象。
illuminati 2009-07-30
  • 打赏
  • 举报
回复
难道是编译器就是这么规定的
illuminati 2009-07-30
  • 打赏
  • 举报
回复
我就是不理解书上的对->重载的定义
class ScreenPtr {
public:
// constructor and copy control members as before
Screen &operator*() { return *ptr->sp; }
Screen *operator->() { return ptr->sp; }
const Screen &operator*() const { return *ptr->sp; }
const Screen *operator->() const { return ptr->sp; }
private:
ScrPtr *ptr; // points to use-counted ScrPtr class
};

class ScrPtr {
friend class ScreenPtr;
Screen *sp;
size_t use;
ScrPtr(Screen *p): sp(p), use(1) { }
~ScrPtr() { delete sp; }
};

那位高手能详细帮忙解释一下
hai040 2009-07-30
  • 打赏
  • 举报
回复
cout << typeid(vector<int>::iterator().operator ->()).name() << '\n';
Vegertar 2009-07-30
  • 打赏
  • 举报
回复
operator -> 的重载解析就是这么规定的,返回的新对象再执行 -> 运算。
pengzhixi 2009-07-30
  • 打赏
  • 举报
回复
point.operator->()->action
看看point 里面重载的operator->()返回 的指针和action的关系。
Vegertar 2009-07-30
  • 打赏
  • 举报
回复
了不起的感觉,你是怎么感觉到的?
illuminati 2009-07-30
  • 打赏
  • 举报
回复
打错了
感觉应该与与point.operator->().action相同,为什么书上写的是与point.operator->()
->action相同,不理解
pengzhixi 2009-07-30
  • 打赏
  • 举报
回复
被迷糊。
taodm 2009-07-30
  • 打赏
  • 举报
回复
point.operator->()action
这能是合法语法么。

64,636

社区成员

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

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