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


183

我在阅读有关C ++优缺点的问题的答案,并在阅读注释时遇到了疑问。

程序员经常发现“ this”是一个指针而不是一个引用令人困惑。另一个困惑是为什么“ hello”不是std :: string类型,而是求值为char const *(指针)(在数组到指针的转换之后)– Johannes Schaub-litb 08年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”是常量,因此是只读的。这样可以防止错误,并为调用者提供一定程度的保证,即该对象不会更改。– Doug T. 08年12月22日在16:42

您不能重新分配“此”。即您不能执行“ this =&other;”,因为这是一个右值。但这是T *类型,而不是T const类型。即它是一个非恒定指针。如果您使用的是const方法,则它是指向const的指针。T常量 但指针本身是非常量– Johannes Schaub-litb 08年12月22日在17:53

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

我的问题是,为什么this指针不是引用?使其成为指针有任何特殊原因吗?


为什么this要成为引用会更有意义:

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

5
@paulm这个“ hack”将实际完成什么工作?并不this总是评估为true
iFreilicht 2014年

6
@paulm我认为这实际上不是有效的C ++。在nullptr上向对象调用方法会导致未定义的行为。
2014年

5
@paulm也许在某些情况下可以使用,但请想象该方法是否可行。在没有对象的情况下如何进行v表查找?
杰森·克赖顿

3
@paulm如果您已在生产代码中看到它,请放弃发货!那是UB。
爱丽丝

6
我要离开这里...(来自MFC的afxwin2.inl):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Christopher Oicles 2015年

Answers:


176

当该语言第一次发展时,在具有实际用户的早期版本中,没有引用,只有指针。添加操作员重载时添加了引用,因为它要求引用保持一致。

的用途之一this是使对象获得指向自身的指针。如果是参考,我们必须写&this。另一方面,当我们编写赋值运算符时,我们必须这样做return *this,它看起来像起来更简单return this。因此,如果您的菜板空白,则可以选择其中任何一种方式。但是C ++逐渐发展以响应用户社区的反馈(例如最成功的事物)。向后兼容性的价值完全压倒了由于this作为参考或指针而产生的次要优点/缺点。


4
好吧,对象通常也可以参考自身。我会说这是更常见的用法。无论如何,主要原因是您说的那样,引用在创建“ this”指针时不存在。
jalf

20
而且,如果这是参考,那么很难operator &做任何有用的事情。必须有一些特殊的语法来获取不会通过的地址operator &
2010年

10
@conio-下次您靠近C ++编译器时,可能要检查一下!:)就像这样:int n = 5; int &r = n; int *p = &r; std::cout << *p;
Daniel Earwicker 2010年

14
@Omnifarious您可以编写&reinterpret_cast<char&>(this);以获取重载的真实地址operator&(实际上,这是做什么的boost::addressof)。
Johannes Schaub-litb

9
由于将其this设为null 并没有任何意义,因此在我看来,引用确实更合适。
Ponkadoodle

114

派对晚了一点…… Bjarne Stroustrup直言不讳,直言不讳(这在《 C ++设计与演变》一书中是重复的,或摘自该书):

为什么this没有参考?

因为在添加引用之前,“ this”已引入C ++(实际上是带有类的C)。另外,我选择了“ this”来遵循Simula的用法,而不是(后来的)Smalltalk对“ self”的用法。


2
是的,self可以很好地与其他语言保持一致,哦。
pilkch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.