C++ 运算符重载的问题。可能是低级问题,求人解答。

左潇龙
博客专家认证
2013-07-05 11:14:49
class Handle VALUE_OBJ_CLASS_SPEC {
private:
oop* _handle;

protected:
oop obj() const { return _handle == NULL ? (oop)NULL : *_handle; }
oop non_null_obj() const { assert(_handle != NULL, "resolving NULL handle"); return *_handle; }

public:
// Constructors
Handle() { _handle = NULL; }
Handle(oop obj);
#ifndef ASSERT
Handle(Thread* thread, oop obj);
#else
// Don't inline body with assert for current thread
Handle(Thread* thread, oop obj);
#endif // ASSERT

// General access
oop operator () () const { return obj(); }
oop operator -> () const { return non_null_obj(); }
bool operator == (oop o) const { return obj() == o; }
bool operator == (const Handle& h) const { return obj() == h.obj(); }

// Null checks
bool is_null() const { return _handle == NULL; }
bool not_null() const { return _handle != NULL; }

// Debugging
void print() { obj()->print(); }

// Direct interface, use very sparingly.
// Used by JavaCalls to quickly convert handles and to create handles static data structures.
// Constructor takes a dummy argument to prevent unintentional type conversion in C++.
Handle(oop *handle, bool dummy) { _handle = handle; }

// Raw handle access. Allows easy duplication of Handles. This can be very unsafe
// since duplicates is only valid as long as original handle is alive.
oop* raw_value() { return _handle; }
static oop raw_resolve(oop *handle) { return handle == NULL ? (oop)NULL : *handle; }
};


上面这是一个类,其中好像是重载了->和()。
那么假设有个Handle对象obj,下面这句话是什么呢。
obj->klass()


求帮助,我是搞JAVA的,对C++的运算符重载不是特别清楚,下面那两个==的重载我是看懂了,可是上面的->和()就完全不明白了,而且百度了一下,好像有说->不能重载的。
可是这是JAVA虚拟机的源码,不可能出错吧。
求解释。

在线等。
...全文
308 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
左潇龙 2013-07-08
  • 打赏
  • 举报
回复
不管怎么说,感谢各位的光临了,散分了。
bljswpu 2013-07-07
  • 打赏
  • 举报
回复
-> 重载的是指针的 返回的是对象的地址
左潇龙 2013-07-06
  • 打赏
  • 举报
回复
引用 7 楼 mujiok2003 的回复:
[quote=引用 5 楼 zuoxiaolong8810 的回复:] [quote=引用 2 楼 mujiok2003 的回复:] 已经重载了->和函数调用运算符()

oop     operator () () const                   { return obj(); }
  oop     operator -> () const                   { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。
哥们 我就想知道obj->klass()这句话到底是返回了一个什么,而且我想知道这句话在操作符->和()重载之后,真正的调用样子应该是什么。 还有能否稍微举个简单的例子说明下->和()重载后的使用方式。无限感激啊。[/quote] 例子就看这个[/quote] 哥们别走啊,全靠你了,貌似大半夜没人啊。
左潇龙 2013-07-06
  • 打赏
  • 举报
回复
引用 5 楼 zuoxiaolong8810 的回复:
[quote=引用 2 楼 mujiok2003 的回复:] 已经重载了->和函数调用运算符()

oop     operator () () const                   { return obj(); }
  oop     operator -> () const                   { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。
哥们 我就想知道obj->klass()这句话到底是返回了一个什么,而且我想知道这句话在操作符->和()重载之后,真正的调用样子应该是什么。 还有能否稍微举个简单的例子说明下->和()重载后的使用方式。无限感激啊。[/quote] obj是Handle类型的,为什么obj->会调用as_class()而不是non_null_obj()呢,还有Klass::Klass()这是不是Klass类的构造方法,那么这么说obj->klass()最终返回的是一个Klass对象?
bengal1124 2013-07-06
  • 打赏
  • 举报
回复
-> 重载之后 返回的 还是指针
bengal1124 2013-07-06
  • 打赏
  • 举报
回复
返回的是对象的地址
mujiok2003 2013-07-05
  • 打赏
  • 举报
回复
引用 5 楼 zuoxiaolong8810 的回复:
[quote=引用 2 楼 mujiok2003 的回复:] 已经重载了->和函数调用运算符()

oop     operator () () const                   { return obj(); }
  oop     operator -> () const                   { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。
哥们 我就想知道obj->klass()这句话到底是返回了一个什么,而且我想知道这句话在操作符->和()重载之后,真正的调用样子应该是什么。 还有能否稍微举个简单的例子说明下->和()重载后的使用方式。无限感激啊。[/quote] 例子就看这个
mujiok2003 2013-07-05
  • 打赏
  • 举报
回复
引用 4 楼 zuoxiaolong8810 的回复:
这下清楚吗,哥们 要是还不清楚,你要什么我给你。可别走啊。
钱。 just kidding. obj->klass(); 先调用operator->, 进而调用as_klass();返回Klass*,最后调用Klass::klass();
左潇龙 2013-07-05
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
已经重载了->和函数调用运算符()

oop     operator () () const                   { return obj(); }
  oop     operator -> () const                   { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。
哥们 我就想知道obj->klass()这句话到底是返回了一个什么,而且我想知道这句话在操作符->和()重载之后,真正的调用样子应该是什么。 还有能否稍微举个简单的例子说明下->和()重载后的使用方式。无限感激啊。
左潇龙 2013-07-05
  • 打赏
  • 举报
回复
class KlassHandle: public Handle {
 protected:
  klassOop    obj() const                        { return (klassOop)Handle::obj(); }
  klassOop    non_null_obj() const               { return (klassOop)Handle::non_null_obj(); }
  Klass*      as_klass() const                   { return non_null_obj()->klass_part(); }

 public:
  // Constructors
  KlassHandle ()                                 : Handle()            {}
  KlassHandle (oop obj) : Handle(obj) {
    assert(SharedSkipVerify || is_null() || obj->is_klass(), "not a klassOop");
  }
  KlassHandle (Klass* kl) : Handle(kl ? kl->as_klassOop() : (klassOop)NULL) {
    assert(SharedSkipVerify || is_null() || obj()->is_klass(), "not a klassOop");
  }

  // Faster versions passing Thread
  KlassHandle (Thread* thread, oop obj) : Handle(thread, obj) {
    assert(SharedSkipVerify || is_null() || obj->is_klass(), "not a klassOop");
  }
  KlassHandle (Thread *thread, Klass* kl)
    : Handle(thread, kl ? kl->as_klassOop() : (klassOop)NULL) {
    assert(is_null() || obj()->is_klass(), "not a klassOop");
  }

  // Direct interface, use very sparingly.
  // Used by SystemDictionaryHandles to create handles on existing WKKs.
  // The obj of such a klass handle may be null, because the handle is formed
  // during system bootstrapping.
  KlassHandle(klassOop *handle, bool dummy) : Handle((oop*)handle, dummy) {
    assert(SharedSkipVerify || is_null() || obj() == NULL || obj()->is_klass(), "not a klassOop");
  }

  // General access
  klassOop    operator () () const               { return obj(); }
  Klass*      operator -> () const               { return as_klass(); }
};
这是它的一个子类。 下面那个调用的全部语句是
const KlassHandle klass (THREAD, obj->klass());
这下清楚吗,哥们 要是还不清楚,你要什么我给你。可别走啊。
左潇龙 2013-07-05
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
已经重载了->和函数调用运算符()

oop     operator () () const                   { return obj(); }
  oop     operator -> () const                   { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。
嗯 我给你全点的代码,哥们别走啊,给我看看。我给你贴上来 稍等一分钟。
mujiok2003 2013-07-05
  • 打赏
  • 举报
回复
已经重载了->和函数调用运算符()

oop     operator () () const                   { return obj(); }
  oop     operator -> () const                   { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。
左潇龙 2013-07-05
  • 打赏
  • 举报
回复
没人吗,感觉这个问题对于真正的C++使用者应该不是什么大难题吧,难道就没人解答吗,这个->和()的重载到底是什么意思哦。 LZ在等呢啊。求帮助。

64,266

社区成员

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

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