I was reading the answers to this question C++ pros and cons and got this doubt while reading the comments.
programmers frequently find it confusing that "this" is a pointer but not a reference. another confusion is why "hello" is not of type std::string but evaluates to a char const* (pointer) (after array to pointer conversion) – Johannes Schaub - litb Dec 22 '08 at 1:56
That only shows that it doesn't use the same conventions as other (later) languages. – le dorfier Dec 22 '08 at 3:35
I'd call the "this" thing a pretty trivial issue though. And oops, thanks for catching a few errors in my examples of undefined behavior. :) Although I don't understand what info about size has to do with anything in the first one. A pointer is simply not allowed to point outside allocated memory – jalf Dec 22 '08 at 4:18
Is this a constant poiner? – yesraaj Dec 22 '08 at 6:35
this can be constant if the method is const int getFoo() const; <- in the scope of getFoo, "this" is constant, and is therefore readonly. This prevents bugs and provides some level of guarantee to the caller that the object won't change. – Doug T. Dec 22 '08 at 16:42
you can't reassign "this". i.e you cannot do "this = &other;", because this is an rvalue. but this is of type T*, not of type T const . i.e it's a non-constant pointer. if you are in a const method, then it's a pointer to const. T const . but the pointer itself is nonconst – Johannes Schaub - litb Dec 22 '08 at 17:53
think of "this" like this: #define this (this_ + 0) where the compiler creates "this_" as a pointer to the object and makes "this" a keyword. you can't assign "this" because (this_ + 0) is an rvalue. of course that's not how it is (there is no such macro), but it can help understand it – Johannes Schaub - litb Dec 22 '08 at 17:55
My question is, why is this
a pointer a not a reference? Any particular reason for making it a pointer?
Some further arguments why this
being a reference would make sense:
- Consider
Item 1
fromMore Effective C++
: use references when it is guaranteed that we have a valid object i.e. not a NULL (my interpretation). - Furthermore, references are considered safer than pointers (because we can't screw the memory up with a stray pointer).
- Thirdly, the syntax for accessing references (
.
) is a little bit nicer and shorter than accessing pointers (->
or(*)
).
this
always evaluate totrue
? – iFreilicht_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
– Christopher Oicles