我正在阅读这个问题 C++ pros and cons 的答案,并在阅读评论时遇到了这个疑问。
程序员经常发现“this”是指针而不是引用令人困惑。另一个困惑是为什么“hello”不是 std::string 类型,而是评估为 char const*(指针)(在数组到指针转换之后) – Johannes Schaub - 2008 年 12 月 22 日在 1:56 这仅表明它不使用与其他(后来的)语言相同的约定。 — — le dorfier 08 年 12 月 22 日在 3:35 我会称“这个”事情虽然是一个非常微不足道的问题。哎呀,感谢您在我的未定义行为示例中发现了一些错误。 :) 虽然我不明白关于大小的信息与第一个中的任何内容有什么关系。指针根本不允许指向外部分配的内存– jalf 2008 年12 月22 日在4:18 这是一个常量指针吗? – yesraaj 2008 年 12 月 22 日 6:35,如果方法是 const int getFoo() const; 这可以是常数; <- 在 getFoo 的范围内,“this”是常量,因此是只读的。这可以防止错误并为调用者提供一定程度的保证,即对象不会更改。 — — Doug T. 08 年 12 月 22 日在 16:42 你不能重新分配"这个"。即你不能做“this = &other;”,因为这是一个右值。但这是 T* 类型,而不是 T const 类型。即它是一个非常量指针。如果你在一个 const 方法中,那么它是一个指向 const 的指针。常数。但指针本身是非常量的 – Johannes Schaub - litb 2008 年 12 月 22 日 17:53 认为“this”是这样的:#define this (this_ + 0) 其中编译器将“this_”创建为指向对象的指针并生成“这”一个关键字。您不能分配“this”,因为 (this_ + 0) 是一个右值。当然不是这样(没有这样的宏),但它可以帮助理解它 – Johannes Schaub - 2008 年 12 月 22 日 17:55
我的问题是,为什么 this
指针不是引用?使它成为指针的任何特殊原因?
一些进一步的论点为什么 this
作为参考是有意义的:
考虑更有效的 C++ 中的第 1 项:当保证我们有一个有效的对象即不是 NULL 时使用引用(我的解释)。
此外,引用被认为比指针更安全(因为我们不能用杂散的指针搞砸内存)。
第三,访问引用 (.) 的语法比访问指针 (-> 或 (*)) 更好更短。
this
不总是评估为 true
吗?
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
当语言第一次发展时,在真正用户的早期版本中,没有引用,只有指针。添加运算符重载时添加了引用,因为它需要引用才能始终如一地工作。
this
的用途之一是让对象获得指向自身的指针。如果它是一个引用,我们必须写 &this
。另一方面,当我们编写赋值运算符时,我们必须使用 return *this
,它看起来更简单为 return this
。所以如果你有一张白纸,你可以用任何一种方式争论。但是 C++ 逐渐演变为响应来自用户社区的反馈(就像大多数成功的事情一样)。向后兼容性的价值完全压倒了源自 this
作为引用或指针的次要优势/劣势。
派对有点晚了......直接从马的嘴里,here's what Bjarne Stroustrup has to say(基本上重复或取自“C ++的设计和演变”一书):
为什么“这个”不是参考?因为“this”在添加引用之前被引入 C++(实际上是带类的 C)。另外,我选择“this”来遵循 Simula 的用法,而不是(后来)Smalltalk 使用“self”。
self
可以是类似于 *this
的关键字。
#define self *this
除了其他答案之外,由于 Deducing this 是 in C++23,因此可以引用对其调用成员函数的对象(而不是 this
指针):
struct Foo {
void bar(this Foo& self) {
// self is a reference to Foo
}
};
int main() {
Foo foo;
foo.bar();
}
operator &
来做任何有用的事情。必须有一些特殊的语法来获取不会通过operator &
的 this 的地址。int n = 5; int &r = n; int *p = &r; std::cout << *p;
&reinterpret_cast<char&>(this);
来获取重载operator&
的真实地址(实际上,这就是boost::addressof
所做的)。this
为 null 并没有任何意义,因此在我看来,引用确实更合适。