程序员经常会感到困惑,“this”是一个指针而不是引用。另一个困惑是为什么“hello”不是std :: string类型,但在数组转换为指针后评估为char const *(指针)– Johannes Schaub - litb Dec 22 '08 at 1:56
这只表明它不使用与其他(较新的)语言相同的约定。– le dorfier Dec 22 '08 at 3:35
虽然我不明白第一个示例中有关大小的信息与任何事情有关系,但我认为“this”是一个相当微不足道的问题。还有一些未定义行为示例中的错误需要纠正。 :) 指针根本不能指向分配的内存之外– jalf Dec 22 '08 at 4:18
这是一个常量指针吗?– yesraaj Dec 22 '08 at 6:35
如果方法是const int getFoo() const; <-在getFoo的范围内,“this”是常量,并且因此只读。这可以防止错误并为调用者提供某种级别的保证,表明对象不会更改。– Doug T. Dec 22 '08 at 16:42
你不能重新分配“this”。即你不能做“this = &other;”,因为这是一个rvalue。但是它的类型是T *,而不是T const。也就是说,它是一个非常量指针。如果您在const方法中,则它是指向常量的指针。T const。但指针本身是非常量的– Johannes Schaub - litb Dec 22 '08 at 17:53
将“this”视为这样:#define this(this_ + 0),其中编译器创建“this_”作为指向对象的指针,并将“this”作为关键字。您无法分配“this”,因为(this_ + 0)是rvalue。当然,它并不是这样的(没有这样的宏),但它可以帮助理解– Johannes Schaub - litb Dec 22 '08 at 17:55
我的问题是,为什么this
是一个指针而不是引用?有什么特殊的原因使它成为指针吗?
以下是一些进一步的论据,说明this
是一个引用是有道理的:
- 考虑
More Effective C++
中的项目1
:在确保存在有效对象(而非NULL)时使用引用(我的理解)。 - 此外,相对于指针来说,引用更加安全(因为我们无法通过错误指针破坏内存)。
- 第三,访问引用的语法(
.
)比访问指针(->
或(*)
)更加简洁和舒适。
this
不是默认为true
吗? - iFreilicht_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
翻译后内容:此处仅供参考...(源自MFC的afxwin2.inl):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
。 - Christopher Oicles