2016-04-13 3 views
3

Так я знаю, что this является ссылкой на сам класс, однако я не могу сказать, что это происходит в, если заявлениеИспользуя это, если заявление

Что делает следующий код?

if(this) 
    { 
     //Code goes here... 
    } 

Я уверен, что проверяет, не класс ли он, но дальнейшее объяснение было бы замечательным!

+0

«Я знаю, что это ссылка на сам класс» - нет. 'this' является ** указателем **, а не ссылкой. –

ответ

1

this Указатель - постоянный указатель, который содержит адрес памяти текущего объекта. Таким образом, технически это будет проверять, является ли оно нулевым или нет, которое не будет равно null в функции-члене. Поскольку вы не сможете вызвать класс до тех пор, пока у вас не будет объекта, а в абстрактных классах вы все равно не сможете его использовать. Итак, это, если не имеет большого смысла.

+0

«это никогда не будет равным нулю в функции-члене, поэтому проверка, которую вы выполняете, бесполезна». Это то же самое, что я имел в виду. –

+0

Я беру свой downvote, но все же ваше утверждение неверно: «которое не будет равно null в функции-члене». 'this' может быть NULL. – iammilind

+0

Как это может быть null? До тех пор, пока ваш объект не будет доступен, его нельзя использовать. Я что-то упускаю? –

0

Он пытается проверить, был ли метод вызван указателем NULL, например. что-то вроде этого: (! даже без виртуального метода)

Foo * foo = NULL; 
foo->TheMethod(); 

Однако, это не является допустимым метод, так как вызов метода на указатель NULL является неопределенное поведение и поэтому тест не будет работать надежно ,

0

Это действительно проверка, если this != nullptr. Однако к тому времени, как вы достигнете этого утверждения, вы уже прошли от неопределенного поведения. Поскольку доступен только в методе класса и вызов такого метода с nullptr является UB.

Следовательно, такое утверждение никогда не служит какой-либо действительной цели.

Кроме UB, также помните, что такие проверки полезны только при вызове с указателем. Они не имеют отношения к объекту/ссылке. Если метод равен virtual, тогда большая часть архитектуры приведет к сбою кода до достижения этого if.