为什么“这个”是一个指针而不是一个参考?
我正在阅读这个问题的答案C + +的利弊,并阅读评论时有这个疑问。
程序员经常发现,“this”是指针而不是引用。 另一个困惑是为什么“你好”是不是types的std ::string,但计算为一个字符常量*(指针)(在数组到指针转换后) – 约翰内斯Schaub评论时间70年01月01日原作者:
这只表明它不使用与其他(以后)语言相同的约定。 – le dorfier 08年12月22日在3:35
尽pipe如此,我将这个“这个”称为一个非常微不足道的问题。 哎呀,感谢在我的未定义行为的例子中发现了一些错误。 :)虽然我不明白什么信息大小与第一个任何东西有关。 一个指针是根本不允许指向外部分配的内存 – – Jalf 12年12月22日在4:18
这是一个不断沉着? – yesraaj 12年12月22日在6:35
如果方法是const int getFoo()const,则这可以是常量。 < – 在getFoo范围内,“this”是常量,因此是只读的。 这可以防止错误,并为调用者提供一定程度的保证,使对象不会改变。 – 道格T. 08年12月22日在16:42
你不能重新分配“这个”。 即你不能做“this =&other”,因为这是一个右值。 但是这是T *types,而不是T型常量。 即它是一个非常量的指针。 如果你在一个const方法,那么它是一个指向const的指针。 T常量。 但指针本身是nonconst – Johannes Schaub – litb 08年12月22日在17:53
想想这个是这样的:#define this(this_ + 0),编译器创build“this_”作为指向对象的指针,并使“this”成为关键字。 你不能指定“this”,因为(this_ + 0)是一个右值。 当然不是这样(没有这样的macros),但它可以帮助理解它 – 约翰内斯Schaub – litb 08年12月22日在17:55
我的问题是,为什么this
是一个指针而不是一个参考? 任何使它成为指针的特殊原因?
一些进一步的论点为什么this
是一个参考将是有道理的:
- 从
More Effective C++
考虑Item 1
:当保证我们有一个有效的对象,即不是NULL(我的解释)时,使用引用。 - 而且,引用被认为比指针更安全(因为我们不能用一个杂散指针将内存搞砸了)。
- 第三,访问引用(
.
)的语法比访问指针(->
或(*)
)更好一些。
当语言第一次发展时,在早期版本中有真实用户,没有引用,只有指针。 添加操作符重载时添加了引用,因为它要求引用一致地工作。
其中的一个用途是让对象获得指向自己的指针。 如果这是一个参考,我们必须写&this
。 另一方面,当我们写一个赋值操作符时,我们必须return *this
,这看起来更简单,因为return this
。 所以,如果你有一个空白的石板,你可以辩论这种方式。 但是,C ++逐渐演变,以回应用户群体的反馈(如最成功的东西)。 向后兼容的价值完全压倒了作为参考或指针的次要优点/缺点。
晚了一点……直接从马的嘴里, 这是Stroupstrup所要说的 (基本上是从“C ++devise与演变”一书中重复出现的):
为什么“这个”不是一个参考?
因为在引用被添加之前,“this”被引入到了C ++中(真正用C语言来引入)。 另外,我select了“这个”来遵循Simula的用法,而不是(后来的)Smalltalk使用“self”。
C ++标准指出
9.3.2 / 1
在非静态(9.3)成员函数的主体中,关键字this是一个非左值expression式,其值是调用该函数的对象的地址。 这个在类X的成员函数中的types是X *。 如果成员函数被声明为const,则其types为const X *,如果成员函数被声明为volatile,则其types为volatile X *,如果成员函数被声明为const volatile,则其types为const挥发性X *。
但在其他参考文献中,却发现了其他的东西。所以有人主动向Stroustrup先生发了一封邮件。 随后的谈话可以在这里find。
不pipe我们如何到达这里,我认为这是一个指针,而不是一个参考是幸运的,因为这有助于“有意义”,您可以删除它:
void A::f () { delete &this; }
我认为这是一个没有必要通过devise的情况,C ++就更好了。