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

Nav*_*een 178 c++ pointers reference c++-faq this

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

程序员经常发现令人困惑的是"this"是指针而不是引用.另一个困惑是为什么"hello"不是std :: string类型但是求值为char const*(指针)(在数组到指针转换之后) - Johannes Schaub - litb于2008年12月22日在1:56

这只表明它没有使用与其他(后来的)语言相同的约定. - le dorfier 2008年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.但是指针本身是无关紧要的 - 约翰内斯·绍布 - 在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(我的解释)时,使用引用.
  • 此外,引用被认为比指针更安全(因为我们不能用一个迷路指针拧紧内存).
  • 第三,访问references(.)的语法比访问指针(->(*))更好,更短.

Dan*_*ker 170

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

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

  • 并且,如果这是一个引用,那么重载`operator &`来做任何有用的事情都很困难.必须有一些特殊的语法来获取不会通过`operator&`的地址. (19认同)
  • @Omnifarious你可以编写`&reinterpret_cast <char&>(this);`来获取重载`operator&`的实际地址(事实上,这就是`boost :: addressof`的作用). (14认同)
  • @conio - 你可能想检查下次你是否接近C++编译器!:)类似于:`int n = 5; int&r = n; int*p =&r; std :: cout <<*p;` (10认同)
  • 因为"this"没有任何意义为null,所以在我看来,引用确实更合适. (9认同)
  • 好吧,对象通常也可以获得对自身的引用.我会说这是一个更常见的用法.无论如何,主要原因就像你说的那样,当他们创建'this'指针时,引用并不存在. (4认同)

Mic*_*urr 114

派对有点晚了......直接从马的嘴里,这就是Bjarne Stroustrup所说的内容(基本上是在"C++的设计和演变"一书中重复或取自):

为什么"这个"不是参考?

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

  • `#define self *this` (6认同)
  • “self”可以是一个类似于“*this”的关键字。 (3认同)
  • 是的,self可以很好地与其他语言保持一致,哦。 (2认同)

小智 10

除了其他答案之外,由于Deducing this在 C++23 中,因此可以引用调用成员函数的对象(而不是this指针):

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

int main() {
  Foo foo;
  foo.bar();
}
Run Code Online (Sandbox Code Playgroud)