Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Динамическая память/С++

#cpp


Недавно начал изучать с++. И в процессе возник вопрос, а именно о том чем nullptr
отличается от NULL?
    


Ответы

Ответ 1



(К "динамической памяти" все это не имеет никакого прямого отношения.) nullptr совсем не обязательно "отличается" от NULL. В современном С++, начиная с C++11, макро NULL может быть определено именно как nullptr. "Классический" NULL представляет собой целочисленное константное выражение1 со значением 0, т.е. может использоваться не только в указательных, но также и в арифметических контекстах (в том числе - по ошибке). nullptr не приводим к целому типу и в арифметических контекстах использован быть не может2. Возможность использования "классического" NULL в указательных контекстах базируется на том, что целочисленное константное значение 0 неявно приводимо к указательному типу. Однако такая неявная приводимость не имеет места в контексте аргументов шаблона. Т.е. NULL не может выступать в качестве null-pointer constant в списке аргументов шаблона template struct S {}; int main() { S s1; // Ошибка! S<(void *) NULL> s2; // OK S s3; // OK } nullptr свободен от этого недостатка. 1 - в современном С++ (с момента появления nullptr), NULL должен быть определен как целочисленный литерал со значением 0. Произвольное целочисленное константное выражение со значением 0 больше не может выступать в роли null-pointer constant. Также в роли null-pointer constant больше не может выступать false и \0. 2 - кроме возможности приведения к bool.

Ответ 2



NULL это дефайн на 0 типа int. nullptr имеет тип указателя, что очень важно в некоторых моментах. Очень подробно эту тему рассматривает Мэйерс в своей книге Effective Modern C++, очень рекомендую вам её к прочтению.

Комментариев нет:

Отправить комментарий