为什么'this'指针而不是引用?

我正在阅读这个问题的答案c++的优点和缺点,在阅读评论时得到了这个疑问。

程序员经常会感到困惑,“this”;是指针而不是引用。另一个困惑是为什么“hello”;不是std::string类型,而是计算为char const*(指针)(在数组到指针转换之后)- Johannes Schaub - litb 12月22 '08 at 1:56

这只能说明它不使用与其他(后来的)语言相同的约定。- le dorfier 2008年12月22日3:35

我把它叫做“this”;这是一个非常微不足道的问题。哦,谢谢你在我的未定义行为的例子中发现了一些错误。:)虽然我不明白关于尺寸的信息与第一个有什么关系。一个指针根本不允许指向已分配的内存之外- jalf 12月22日'08 at 4:18

这是一个常量指针吗?- yesraaj 12月22日08年6:35

如果方法为const,则此值可以为常量。<-在getFoo的范围内,"this"为常量,因此为只读。这可以防止错误,并向调用方保证对象不会改变。- Doug T. 2008年12月22日16:42

你不能重新分配“this”。也就是说,你不能用“this = &other;&;”,因为这是一个右值。但这是T*类型,而不是T const类型。也就是说,它是非常量指针。如果你在一个const方法中,那么它是指向const的指针。T常量。但指针本身是非const - Johannes Schaub - litb 12月22日08年17:53

想想“this”;像这样:#define this (this_ + 0),其中编译器创建"this_"作为指向对象的指针,使"this"一个关键字。你不能赋值“this”;因为(this_ + 0)是一个右值。当然不是这样的(没有这样的宏观),但它可以帮助理解它- Johannes Schaub - litb 2008年12月22日17:55

我的问题是,为什么this是指针而不是引用?把它作为指针有什么特别的原因吗?


一些进一步的论证为什么this作为引用是有意义的:

  • 考虑Item 1来自More Effective C++ :当保证我们有一个有效的对象时使用引用,即不是NULL(我的解释)。
  • 此外,引用被认为比指针更安全(因为我们不能用一个游离的指针来破坏内存)。
  • 第三,访问引用的语法(.)比访问指针(->(*))更好、更短。
34824 次浏览

在语言最初发展的时候,在真实用户的早期版本中,没有引用,只有指针。在添加操作符重载时添加了引用,因为它需要引用才能一致地工作。

this的用途之一是让对象获取指向自身的指针。如果它是一个引用,我们必须写&this。另一方面,当我们写赋值操作符时,我们必须return *this,它看起来更简单,如return this。如果你有一张白纸,你可以用两种方式来论证。但c++是根据用户社区的反馈而逐渐发展起来的(就像大多数成功的事情一样)。向后兼容性的价值完全压倒了this作为引用或指针所产生的小优点/缺点。

来的有点晚了…直接从马的嘴里,这是Bjarne Stroustrup说的(这基本上是重复或从“设计和进化的c++ "书):

为什么&;this"不是参考?

因为“this"在添加引用之前就被引入c++(实际上是引入C with Classes)。另外,我选择了"this"来遵循Simula的用法,而不是(后来)Smalltalk的“self”用法。

除了其他答案外,由于推导出这个在c++中23,因此可以有一个对调用成员函数的对象的引用(而不是this指针):

struct Foo {
void bar(this Foo& self) {
// self is a reference to Foo
}
};


int main() {
Foo foo;
foo.bar();
}