提问人:Naveen 提问时间:3/14/2009 最后编辑:CommunityNaveen 更新时间:11/21/2021 访问量:36356
为什么“this”是指针而不是引用?
Why is 'this' a pointer and not a reference?
问:
我正在阅读这个问题的答案 C++ 的优缺点,并在阅读评论时产生了这个疑问。
程序员经常发现“this”是一个指针而不是引用,这令人困惑。另一个混淆是为什么“hello”不是 std::string 类型,而是计算结果为 char const* (指针) (在数组到指针转换之后) – Johannes Schaub - litb Dec 22 '08 at 1:56
这仅表明它没有使用与其他(后来的)语言相同的约定。– le dorfier Dec 22 '08 at 3:35
不过,我会称“这个”事情是一个非常微不足道的问题。哎呀,感谢您在我的未定义行为示例中发现一些错误。:)虽然我不明白关于大小的信息与第一个中的任何内容有什么关系。指针根本不允许指向分配的内存之外 – jalf Dec 22 '08 at 4:18
这是一个恒定的 poiner 吗?– yesraaj Dec 22 '08 at 6:35
如果方法是 const int getFoo() const,这可以是常量;<- 在 getFoo 的范围内,“this”是常量,因此是只读的。这样可以防止 bug,并为调用方提供一定程度的保证,即对象不会更改。– Doug T. Dec 22 '08 at 16:42
您无法重新分配“this”。也就是说,你不能做“this = &other;”,因为这是一个右值。但这属于 T* 类型,而不是 T const 类型。即它是一个非常量指针。如果你使用的是 const 方法,那么它是指向 const 的指针。但指针本身是非常量的 – Johannes Schaub - litb Dec 22 '08 at 17:53
可以这样考虑“this”:#define this (this_ + 0),编译器创建“this_”作为指向对象的指针,并使“this”成为关键字。不能分配“this”,因为 (this_ + 0) 是右值。当然不是这样(没有这样的宏),但它可以帮助理解它 – Johannes Schaub - litb Dec 22 '08 at 17:55
我的问题是,为什么指针不是引用?有什么特别的原因让它成为指针吗?this
一些进一步的论点,为什么作为参考是有意义的:this
- 考虑从:当保证我们有一个有效的对象时,使用引用,即不是 NULL(我的解释)。
Item 1
More Effective C++
- 此外,引用被认为比指针更安全(因为我们不能用杂散指针搞砸内存)。
- 第三,访问引用 () 的语法比访问指针 ( 或 ) 更好、更短。
.
->
(*)
答:
当该语言首次发展时,在真实用户的早期版本中,没有引用,只有指针。添加运算符重载时添加了引用,因为它需要引用才能一致地工作。
的用途之一是让对象获取指向自身的指针。如果是参考,我们就得写.另一方面,当我们编写赋值运算符时,我们必须 ,这看起来更简单。因此,如果你有一张白纸,你可以以任何一种方式争论它。但是 C++ 逐渐发展起来,以响应用户社区的反馈(就像大多数成功的东西一样)。向后兼容性的价值完全压倒了作为引用或指针所产生的次要优点/缺点。this
&this
return *this
return this
this
评论
operator &
operator &
int n = 5; int &r = n; int *p = &r; std::cout << *p;
&reinterpret_cast<char&>(this);
operator&
boost::addressof
this
派对有点晚了......直接从马的嘴里,这是Bjarne Stroustrup要说的话(基本上在“C++的设计与进化”一书中重复或摘自):
为什么“”不是引用?
this
因为在添加引用之前,“this”被引入 C++(实际上是带有类的 C)。此外,我选择“”来遵循 Simula 的用法,而不是(后来的)Smalltalk 使用“self”。
this
评论
self
可能是一个像 .*this
#define self *this
#define self (*this)
除了其他答案之外,由于在 C++23 中推断了这一点,因此可以引用调用成员函数的对象(而不是指针):this
struct Foo {
void bar(this Foo& self) {
// self is a reference to Foo
}
};
int main() {
Foo foo;
foo.bar();
}
评论
this Self&& self
forward_like
declval
to_address
launder
start_lifetime_as
enable_if
void_t
destroying_delete_t
reference_wrapper
move_only_function
bind_front/back
评论
this
true
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }