Evgenii Legotckoi
Шілде 21, 2020, 12:31 Т.Қ.

nullptr бойынша әдіс шақыру

Разберём небольшой пример кода, когда вызывается метод у объекта, который инициализирован nullptr .


Пример кода

Нам дан следующий программный код.

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct X
  6. {
  7. X* self()
  8. {
  9. cout << "call method of nullptr" << endl;
  10.  
  11. if (!this)
  12. {
  13. cout << "object does not exist" << endl;
  14. return nullptr;
  15. }
  16.  
  17. cout << "object exist" << endl;
  18. return this;
  19. }
  20. };
  21.  
  22. int main()
  23. {
  24. X* x = nullptr;
  25. if (x->self())
  26. {
  27. return 0;
  28. }
  29.  
  30. return 0;
  31. }
  32.  

Пояснение

Как вы думаете, упадёт ли программа в данном случае? А если нет, то что будет выведено в консоль?

Как правило программа в большинстве случае падать не будет. Но это неизвестно. Данный код является примером неопределённого поведения, то есть Undefined Behaviour . Поведение программы будет определяться внутренней реализацией компилятора и не даст гарантированного результата. То есть падение программы и исправное выполнение программы являются равнозначно правильными ответами.

Что же произойдёт в случае исправного функционирования программы?

Ответ: В консоль будет выведено следующее сообщение

  1. call method of nullptr
  2. object does not exist

То есть метод выполнится как статический метод, как если бы мы обращались к статическому методу класса. Это возможно за счёт того, что известен тип объекта, сигнатура и реализация вызываемого метода. При этом не выполняется обращение к внутренним переменным класса. А проверка на this позволяет удостовериться, существует ли объект. Также можно обойтись и без этой проверки, код всё равно будет выполняться да тех пор, пока не встретится часть кода, которая требует созданного объекта.

Заключение

Тем не менее данный код является примером неопределённого поведения - Undefined Behaviour . Поэтому такие фокусы крайне не рекомендуются при разработке программного обеспечения. Поскольку даже если сейчас код работает, то в следующей версии компилятора это может перестать работать. Поэтому несколько раз подумайте, прежде чем такое писать.

Мақала бойынша сұралады0сұрақтар(лар)

1

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз