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

时间:2009-03-14 14:37:04

标签: c++ pointers reference this c++-faq

我正在阅读这个问题的答案C++ pros and cons并在阅读评论时遇到了这个疑问。

  

程序员经常发现令人困惑的是“this”是指针而不是引用。另一个混乱是为什么“你好”不是类型std :: string但是求值为char const *(指针)(在数组到指针转换之后) - Johannes Schaub - litb '00去年12月22日1:56

     

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

     

我称之为“这个”的事情虽然是一个非常微不足道的问题。还有哎呀,感谢我在未定义行为的示例中捕获了一些错误。 :)虽然我不明白大小的信息与第一个中的任何东西有关。根本不允许指针指向已分配的内存 - jalf 08年12月22日4:18

     

这是一个不变的人吗? - yesraaj 08年12月22日6:35

     

如果方法是const int getFoo()const,这可以是常量; < - 在getFoo的范围内,“this”是常量,因此是readonly。这可以防止错误并为调用者提供某种程度的保证,即对象不会更改。 - 道格T. 2008年12月22日16:42

     

你无法重新分配“这个”。即你不能做“this =& other;”,因为这是一个右值。但这是T *类型,而不是T const类型。即它是一个非常量指针。如果你在const方法中,那么它是一个指向const的指针。 T const。但是指针本身是无关紧要的--Johannes Schaub - litb于2008年12月22日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(我的解释)时,使用引用。
  • 此外,引用被认为比指针更安全(因为我们无法使用杂散指针将内存搞砸)。
  • 第三,访问引用(.)的语法比访问指针(->(*))更好,更短。

4 个答案:

答案 0 :(得分:163)

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

this的一个用途是让对象获取指向自身的指针。如果是参考,我们必须写&this。另一方面,当我们编写赋值运算符时,我们必须return *this,这看起来更简单为return this。因此,如果你有一个空白的石板,你可以争论它。但是C ++逐渐发展以响应来自用户社区的反馈(如大多数成功的事情)。向后兼容性的价值完全压倒了源自this作为引用或指针的次要优点/缺点。

答案 1 :(得分:106)

派对有点晚了......直接从马的嘴里here's what Bjarne Stroustrup has to say(基本上是在“C ++的设计和演变”一书中重复或取自):

  

为什么“这个”不是参考?

     

因为在添加引用之前,“this”被引入到C ++中(实际上是带有Classes的C语言)。另外,我选择“this”来跟随Simula的使用,而不是(后来)Smalltalk使用“self”。

答案 2 :(得分:-3)

无论我们如何到达这里,我认为很幸运这个是一个指针,而不是一个参考,因为这有助于“理解”你可以删除它:

void A::f () {
  delete &this;
}

我认为这是一个不必设计的情况,C ++就更好了。

答案 3 :(得分:-3)

C ++标准声明

  

9.3.2 / 1

     

在非静止的体内(9.3)   成员函数,关键字是一个   非左值表达式,其值为   对象的地址   该函数被调用。的类型   这在类X的成员函数中   是X *。如果成员函数是   声明const,这个类型是   const X *,如果成员函数是   声明volatile,这个类型   volatile X *,如果是成员   函数声明为const volatile,   这种类型是const volatile X *。

但是在其他参考文献中,它被发现了其他东西......所以有人采取主动并向Mr. Stroustrup发送邮件。随后的对话可以在 here 找到。