В C++ «узел» - это класс, «узел» - это экземпляр «узла». Почему «* node = nullptr» неверно, а «* node = NULL» правильно?

Node* node;    
*node = nullptr;

Сообщить об ошибке :

error: no viable overloaded '='
       *node = nullptr;

но

Node* node;    
*node = NULL;

верно ?

Другое - это не одно и то же. - Фред Пикер.

Pete Becker 05.07.2018 06:18

Смотрите ответ на этот вопрос: stackoverflow.com/questions/1282295/what-exactly-is-nullptr

saladboy97 05.07.2018 06:20

«node является экземпляром Node» По какой-то причине ни один из ответов, кажется, не говорит вам ясно, что это неверно. node - это указатель к Node.

juanchopanza 05.07.2018 06:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
153
5

Ответы 5

Ни один из них не верен. Вы должны использовать node = nullptr; для назначения переменной node, а не для назначения того, на что указывает node.

Вы должны использовать node = nullptr;

Вы создали указатель и теперь должны выделить указатель, чтобы указывать на что-то, поэтому node = nullptr;

Узел * nullptr; определяет тип переменной nullptr, это указатель на тип node

Скорее всего, Node можно сконструировать с int. Поскольку null определяется как константа int, равная 0, вы ошибочно вызываете конструктор узла и назначаете его узлу.

Как сказал Сид С., node = nullptr - правильное выражение.

s/constructed/assigned/
StoryTeller - Unslander Monica 05.07.2018 06:36

NULL, скорее всего, старый макрос, унаследованный от мира C и определяемый как 0.

Во втором случае номер 0 присваивается переменной типа Node. Тогда как в первом случае назначается указатель (nullptr). Компилятор точно знает, что это неправильно, поскольку *node не является указателем. Значит, он будет жаловаться.

Будет ли он жаловаться на присвоение числового 0 для Node, будет зависеть от того, был ли оператор присваивания для Node перегружен для приема числа. Или есть ли неявное преобразование / конструктор из числа в Node.

Так:

Node* node;    
*node = nullptr;

не может быть выполнено, потому что вы пытаетесь назначить указатель на тип Node, вам следует сделать следующее:

Node* node;    
node = nullptr;

Вы должны понимать, что когда вы объявляете указатель, вы используете следующий синтаксис:

int *n = 5;
n = nullptr;

где следующее

int *n = 5;
*n = 3;

*n - это указатель отмены ссылки, переходящий по адресу, на который указывает n. То же самое и в вашем примере Node. Между тем, *node = NULL может зависеть от реализации. Итак, тип Node может иметь что-то вроде этого:

Node& operator = (const Node &n ) { 
    if (n == NULL) {
        // do something
    }

    // do something else
    return n;
}

Другие вопросы по теме