Евгений Легоцкой21 июля 2020 г. 2:31

Вызов метода на nullptr

Содержание

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

Пример кода

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

#include <iostream>

using namespace std;

struct X
{
    X* self()
    {
        cout << "call method of nullptr" << endl;

        if (!this)
        {
            cout << "object does not exist" << endl;
            return nullptr;
        }

        cout << "object exist" << endl;
        return this;
    }
};

int main()
{
    X* x = nullptr;
    if (x->self())
    {
        return 0;
    }

    return 0;
}

Пояснение

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

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

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

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

call method of nullptr
object does not exist

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

Заключение

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
J

C++ - Тест 001. Первая программа и типы данных

  • Результат:93баллов,
  • Очки рейтинга8
V
  • Vitreg
  • 26 октября 2020 г. 2:35

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
V
  • Vitreg
  • 26 октября 2020 г. 2:23

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
Последние комментарии
S

QML - Урок 026. Intents с Qt для Android, часть 1

Есть ли возможность приведения java типа у QAndroidJniObject? Интересует конкретно class to
ВК

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ?

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
VB

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

Добрый день. Хотел спросить вот что. Создал проект на основе QAbstractTableModel. В MainWindow cоответственно создал модель и связал с представлением. Поиск веду по списку элементов модели,…

QCheckBox в качестве делегата QTableView

До тех пор, пока у вас проект содержит только одну таблицу, или несколько то может быть. Когда их будет 1000 и чекбоксы в разных колонках, то без делегатов и переопределения возвращаемых ре…
Сейчас обсуждают на форуме
DD
  • Dno Dna
  • 28 октября 2020 г. 19:39

MyForm(forms.Form): - непонятка

просто в конструкторе self.user = None
DD
  • Dno Dna
  • 28 октября 2020 г. 19:36

QWebView android

реализовать приведение типа невозможно
DD
  • Dno Dna
  • 28 октября 2020 г. 19:35

не могу передать стринг с QLineEdit

якщо ти про ось це
DD
  • Dno Dna
  • 28 октября 2020 г. 19:32

Siganal slot в ui

какой код должен находиться в слоте он сам не знает
u
  • ubomj
  • 28 октября 2020 г. 6:37

Создание черновика как на авито и тд

Илья а можно пример кода? Пожалуйстааа ^___^ class CreatePostView(LoginRequiredMixin, CreateView): model = Post form_class = PostForm template_name = 'add.html' success_u…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB