Далее в своем коде я проверяю, чтобы проверить, является ли объект пустым или пустым.
Есть ли способ установить объект на ноль?
Далее в своем коде я проверяю, чтобы проверить, является ли объект пустым или пустым.
Есть ли способ установить объект на ноль?
Объект класса не может быть установлен в 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;
Хотя верно, что объект не может быть "пустым/пустым" в 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. Проверьте подробности в руководстве к вашему компилятору.
Вы хотите проверить, является ли объект NULL/empty. Быть NULL и пустым - не то же самое. Как уже упоминал Джастин и Брайан, в С++ NULL - это назначение, которое вы обычно ассоциируете с указателями. Вы можете перегрузить operator = возможно, но подумайте об этом, если вы действительно хотите это сделать. Пара других вещей:
bool IsEmpty()
, который возвращает значение true, если переменные объекта reset относятся к состоянию по умолчанию? Угадайте, что может обойти использование NULL.A* p = new A; ... p = NULL;
является плохим (без удаления p), если вы не можете обеспечить, чтобы ваш код был собран мусором. Если что-нибудь, это приведет к утечке памяти и с несколькими такими утечками, у вас будет хороший код.class Null {}; Null _NULL;
, а затем перегрузить operator = и operator!= других классов в зависимости от вашей ситуации.Возможно, вам следует сообщить нам некоторые подробности о контексте, которые помогут вам лучше с опцией 4.
Арпан
Вы можете установить любой указатель на NULL
, хотя NULL
просто определяется как 0 в С++:
myObject *foo = NULL;
Также обратите внимание, что NULL
определяется, если вы включаете стандартные заголовки, но не встроены в сам язык. Если NULL
- undefined, вы можете использовать 0 вместо этого или включить это:
#ifndef NULL
#define NULL 0
#endif
В стороне, если вы действительно хотите установить объект, а не указатель, на NULL
, вы можете прочитать Образец нулевого объекта.
"объект" какого типа?
Вы, безусловно, можете назначить NULL
(и nullptr
) для объектов типов указателей, и это зависит от реализации, если вы можете назначить NULL
для объектов арифметических типов.
Если вы имеете в виду объекты некоторого типа класса, ответ НЕТ (исключая классы, у которых есть operator=
принимающий указатель или арифметические типы)
"пустой" более правдоподобно, так как многие типы имеют как назначение копирования, так и конструкцию по умолчанию (часто неявно). Чтобы увидеть, похож ли существующий объект на созданный по умолчанию, вам также понадобится соответствующий bool operator==