我正在阅读这个问题的答案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(我的解释)时,使用引用。 .
)的语法比访问指针(->
或(*)
)更好,更短。答案 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 找到。