Подтвердить что ты не робот

Можно ли установить объект на ноль?

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

Есть ли способ установить объект на ноль?

4b9b3361

Ответ 1

Объект класса не может быть установлен в 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;

Ответ 2

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

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

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

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

v1.has_value(); // false

или же

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. Проверьте подробности в руководстве к вашему компилятору.

Ответ 3

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

  • В С++ указатель NULL очень отличается от указателя, указывающего на "пустой" объект.
  • Почему бы не использовать метод bool IsEmpty(), который возвращает значение true, если переменные объекта reset относятся к состоянию по умолчанию? Угадайте, что может обойти использование NULL.
  • Наличие чего-то вроде A* p = new A; ... p = NULL; является плохим (без удаления p), если вы не можете обеспечить, чтобы ваш код был собран мусором. Если что-нибудь, это приведет к утечке памяти и с несколькими такими утечками, у вас будет хороший код.
  • Вы можете сделать это class Null {}; Null _NULL;, а затем перегрузить operator = и operator!= других классов в зависимости от вашей ситуации.

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

Арпан

Ответ 4

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

myObject *foo = NULL;

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

#ifndef NULL
#define NULL 0
#endif

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

Ответ 5

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

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

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

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