Чому "це" вказівник, а не посилання?


183

Я читав відповіді на це питання «за» і «проти» C ++ і мав це сумніви під час читання коментарів.

програмісти часто вважають заплутаним, що "це" є вказівником, але не посиланням. чергова плутанина, чому "привіт" не типу std :: string, але оцінює до char const * (покажчик) (після перетворення масиву в покажчик) - Йоханнес Шауб - litb 22 грудня08 в 1:56

Це лише показує, що він не використовує ті самі умови, що й інші (пізніші) мови. - le dorfier 22 грудня08 р. О 3:35

Я б назвав цю річ досить тривіальною проблемою. І ой, дякую, що ви виявили кілька помилок у моїх прикладах невизначеної поведінки. :) Хоча я не розумію, яка інформація про розмір пов'язана з будь-чим у першому. Вказівник просто не дозволяється вказувати поза виділеною пам’яттю - jalf 22 грудня 2008 р. О 4:18

Це постійний покажчик? - yesraaj 22 грудня08 р. О 6:35

це може бути постійним, якщо метод const int getFoo () const; <- в області getFoo "це" є постійним, і тому читається тільки. Це запобігає помилкам і надає певний рівень гарантії абоненту, що об'єкт не зміниться. - Дуг Т. 22 грудня08 року о 16:42

ви не можете перепризначити "це". тобто ви не можете робити "this = & other;", тому що це оцінка. але це типу T *, а не типу T const. тобто це непостійний покажчик. якщо ви використовуєте метод const, то це вказівник на const. Т const. але сам вказівник є непересічним - Йоганнес Шауб - litb 22 грудня 088 о 17:53

подумайте про "це" приблизно так: #define this (this_ + 0), де компілятор створює "this_" як вказівник на об'єкт і робить "this" ключовим словом. ви не можете призначити "це", тому що (this_ + 0) є оцінкою. звичайно, це не так, як це є (немає такого макросу), але це може допомогти зрозуміти це - Йоханнес Шауб - litb 22 грудня08 о 17:55

Моє запитання: чому thisвказівник не є посиланням? Якась конкретна причина для того, щоб зробити його вказівником?


Ще кілька аргументів, чому thisбути посиланням, має сенс:

  • Поміркуйте Item 1з More Effective C++ : використовуйте посилання, коли гарантується, що у нас є дійсний об'єкт, тобто не NULL (моя інтерпретація).
  • Крім того, посилання вважаються більш безпечними, ніж покажчики (тому що ми не можемо накрутити пам'ять за допомогою бродячого вказівника).
  • По-третє, синтаксис доступу до посилань ( .) трохи приємніший і коротший, ніж доступ до покажчиків ( ->або (*)).

5
@paulm Що б це насправді здійснило? Не thisзавжди оцінюється true?
iFreilicht

6
@paulm Я не думаю, що це насправді C ++. Викликання методів nullptr до об'єкта призводить до невизначеної поведінки.
antred

5
@paulm Можливо, він працює в деяких випадках, але уявіть, якби метод був вірулюючим. Як можна здійснити пошук v-таблиці без об’єкта?
Джейсон Крейтон

3
@paulm Якщо ви бачили це у виробничому коді, відмовтесь від корабля! Тобто UB.
Аліса

6
Я просто покину це тут ... (від afxwin2.inl MFC):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Крістофер Ойкл,

Відповіді:


176

Коли мова вперше розвивалася, у ранніх випусках із реальними користувачами не було посилань, лише вказівники. Додано посилання при перевантаженні оператора, оскільки воно вимагає послідовної роботи посилань.

Одне із застосувань this- це об'єкт отримати вказівник на себе. Якби це була довідка, ми б мали написати &this. З іншого боку, коли ми пишемо оператору призначення, ми маємо це зробити return *this, що було б простіше return this. Отже, якщо у вас був порожній шифер, ви можете це аргументувати будь-яким способом. Але C ++ розвивався поступово у відповідь на відгуки спільноти користувачів (як і більшість успішних речей). Значення зворотної сумісності повністю перевершує незначні переваги / недоліки, пов'язані з thisтим, щоб бути еталонним чи вказівним.


4
Що ж, також часто корисно об’єкту отримати посилання на себе. Я б сказав, що це звичайне використання. У всякому разі, головна причина, як ви сказали, посилань не існувало, коли вони створювали покажчик "це".
jalf

20
І, якби це була довідка, важко було б перевантажити, operator &щоб зробити щось корисне. Потрібно було б створити якийсь спеціальний синтаксис, щоб отримати адресу цього, що не переживе operator &.
всезнайко

10
@conio - можливо, ви хочете перевірити, чи наступного разу ви біля компілятора C ++! :) Щось на кшталт:int n = 5; int &r = n; int *p = &r; std::cout << *p;
Daniel Earwicker

14
@Omnifarious ви можете написати, &reinterpret_cast<char&>(this);щоб отримати справжню адресу для перевантаження operator&(насправді, це щось на зразок boost::addressof).
Йоханнес Шауб - лібл

9
Оскільки це насправді не має сенсу thisбути недійсним, мені здається, що посилання справді більше відповідає.
Ponkadoodle

114

Трохи запізнюючись на вечірку ... Прямо з вуст коня, ось що говорить Bjarne Stroustrup (що по суті повторено в книзі "Дизайн та еволюція C ++"):

Чому " this" не є посиланням?

Тому що "це" було введено в C ++ (справді в C з класами) до того, як були додані посилання. Крім того, я вибрав " this", щоб слідкувати за використанням Simula, а не (пізніше) "Smalltalk" використання "self".


2
Так, мені було б добре узгоджуватись з іншими мовами, ну добре.
пікч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.