Можно ли установить для объекта значение null?

Далее в своем коде я проверяю, является ли объект нулевым / пустым.

Есть ли способ установить для объекта значение null?


person John    schedule 13.06.2010    source источник
comment
Вы должны быть осторожны со своей терминологией (хотите ли вы проверить, указываете ли вы на null или сам объект имеет значение null?) Похоже, вы пришли из управляемого языка. Объекты C ++ никогда не могут быть нулевыми или пустыми. Указатели могут содержать значение нулевого указателя, указывающее, что они ни на что не указывают. Ссылки всегда относятся к объекту. Я бы не рекомендовал пытаться научиться C ++ со знанием других языков, вы навредите себе. Возьмите хорошую книгу для начинающих, это лучший способ учиться. stackoverflow.com/questions/388242 /   -  person GManNickG    schedule 13.06.2010


Ответы (5)


Объект класса не может быть установлен в NULL; однако вы можете установить указатель (который содержит адрес в памяти объекта) в NULL.

Пример того, что вы не можете сделать, о чем спрашиваете:

Cat c;
c = NULL;//Compiling error

Пример того, что вы можете сделать:

Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;
person Brian R. Bondy    schedule 13.06.2010
comment
в качестве отступления для тех, кто хочет поднять это, да, вы можете перегрузить operator =, но это не то, что хочет OP. - person Brian R. Bondy; 13.06.2010
comment
Первый мог работать с Cat::operator=(...). В любом случае, похоже, OP действительно хочет проверить указатель. Итак, +1. - person jweyrich; 13.06.2010
comment
@jweyrich: Я знал, что кто-то так скажет, так что посмотрите мой комментарий перед вашим комментарием :) - person Brian R. Bondy; 13.06.2010
comment
извините, я не обновил страницу перед тем, как опубликовать свой комментарий. Это было просто для полноты картины. Рад, что вы упомянули :) - person jweyrich; 13.06.2010
comment
@wulfgarpro Для nullptr включать не нужно, это ключевое слово. - person Baum mit Augen; 26.01.2018
comment
Правильно, cstddef необходим для хеш-определения NULL, которое является константой нулевого указателя, определенной реализацией. - person wulfgarpro; 27.01.2018

Хотя верно, что объект не может быть "пустым / нулевым" в C ++, в C ++ 17 мы получили _ 1_, чтобы выразить это намерение.

Пример использования:

std::optional<int> v1;      // "empty" int
std::optional<int> v2(3);   // Not empty, "contains a 3"

Затем вы можете проверить, содержит ли optional значение с

v1.has_value(); // false

or

if(v2) {
    // You get here if v2 is not empty
}

Однако простой int (или любой тип) никогда не может быть "нулевым" или "пустым" (по вашему определению этих слов) в каком-либо полезном смысле. Думайте о std::optional как о контейнере в этом отношении.

Если у вас нет компилятора, совместимого с C ++ 17, вы можете использовать boost.optional. Некоторые компиляторы до C ++ 17 также предлагают std::experimental::optional, который будет вести себя, по крайней мере, близко к фактическому std::optional afaik. За подробностями обращайтесь к руководству вашего компилятора.

person Baum mit Augen    schedule 26.01.2018
comment
Или std::experimental::optional, если это предусмотрено вашим компилятором. - person Jonathan Wakely; 26.01.2018

Вы можете установить любой указатель на NULL, хотя NULL просто определяется как 0 в C ++:

myObject *foo = NULL;

Также обратите внимание, что NULL определяется, если вы включаете стандартные заголовки, но не встроен в сам язык. Если NULL не определено, вы можете использовать 0 вместо этого или включить это:

#ifndef NULL
#define NULL 0
#endif

Кстати, если вы действительно хотите установить объект, а не указатель, на NULL, вы можете прочитать о Шаблон "Нулевой объект".

person Justin Ardini    schedule 13.06.2010

Вы хотите проверить, является ли объект NULL / пустым. Быть NULL и пустым - это не одно и то же. Как уже упоминали Джастин и Брайан, в C ++ NULL - это присвоение, которое вы обычно связываете с указателями. Вы можете перегрузить operator = возможно, но хорошо подумайте, если вы действительно хотите это сделать. Еще пара вещей:

  1. В C ++ указатель NULL сильно отличается от указателя, указывающего на «пустой» объект.
  2. Почему бы не иметь bool IsEmpty() метод, который возвращает истину, если переменные объекта сброшены в какое-то состояние по умолчанию? Угадайте, что это могло бы обойти использование NULL.
  3. Иметь что-то вроде A* p = new A; ... p = NULL; - это плохо (без удаления p), если вы не можете гарантировать, что ваш код будет собран сборщиком мусора. Во всяком случае, это привело бы к утечкам памяти, а при нескольких таких утечках велика вероятность, что у вас будет медленный код.
  4. Вы можете сделать это class Null {}; Null _NULL;, а затем перегрузить operator = и operator! = Других классов в зависимости от вашей ситуации.

Возможно, вам стоит опубликовать нам некоторые подробности о контексте, чтобы помочь вам лучше выбрать вариант 4.

Арпан

person Fanatic23    schedule 13.06.2010
comment
Почему бы не использовать метод IsEmpty () типа bool ... - есть несколько веских причин этого не делать. Самая важная из них заключается в том, что это обычно зависит от контекста. Более надежное решение - использовать boost::optional<T>, чтобы указать, есть ли у вас действительный объект T. Это предотвратит вызов x.foo(), когда x.IsEmpty()==true - person MSalters; 14.06.2010

"объект" какого типа?

Вы, конечно, можете назначать NULLnullptr) объектам типов указателей, и это определяется реализацией, если вы можете назначать NULL объектам арифметических типов.

Если вы имеете в виду объекты какого-либо типа, ответ - НЕТ (за исключением классов, имеющих operator= принимающий указатель или арифметические типы).

"empty" более правдоподобен, поскольку многие типы имеют как присваивание копии, так и конструкцию по умолчанию (часто неявно). Чтобы проверить, похож ли существующий объект на созданный по умолчанию, вам также понадобится соответствующий bool operator==

person Caleth    schedule 26.01.2018