Est-il possible de définir un object sur null?

Plus loin dans mon code, je vérifie si un object est null / vide.

Existe-t-il un moyen de définir un object sur null?

Un object d’une classe ne peut pas être défini sur NULL; Cependant, vous pouvez définir un pointeur (qui contient l’adresse de la mémoire d’un object) sur NULL.

Exemple de ce que vous ne pouvez pas faire que vous demandez:

Cat c; c = NULL;//Compiling error 

Exemple de ce que vous pouvez faire:

 Cat c; //Set p to hold the memory address of the object c Cat *p = &c; //Set p to hold NULL p = NULL; 

S’il est vrai qu’un object ne peut pas être “vide / null” en C ++, en C ++ 17, nous avons std::optional pour exprimer cette intention.

Exemple d’utilisation:

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

Vous pouvez ensuite vérifier si l’ optional contient une valeur avec

 v1.has_value(); // false 

ou

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

Un simple int (ou n’importe quel type), cependant, ne peut jamais être “nul” ou “vide” (selon votre définition de ces mots) dans un sens utile. Pensez à std::optional comme un conteneur à cet égard.

Si vous ne disposez pas d’un compilateur compatible C ++ 17, vous pouvez utiliser boost.optional à la place. Certains compilateurs antérieurs à C ++ 17 proposent également std::experimental::optional , qui se comportera au moins de manière similaire à std::optional afaik. Consultez le manuel de votre compilateur pour plus de détails.

Vous voulez vérifier si un object est NULL / vide. Etre NULL et vide ne sont pas les mêmes. Comme Justin et Brian l’ont déjà mentionné, en C ++, NULL est une tâche que vous associez généralement à des pointeurs. Vous pouvez surcharger operator = peut-être, mais réfléchissez bien si vous voulez réellement le faire. Couple d’autres choses:

  1. En C ++, le pointeur NULL est très différent du pointeur pointant sur un object “vide”.
  2. Pourquoi ne pas avoir une bool IsEmpty() qui renvoie true si les variables d’un object sont réinitialisées à un état par défaut? Devinez qui pourrait éviter l’utilisation de NULL.
  3. Avoir quelque chose comme A* p = new A; ... p = NULL; A* p = new A; ... p = NULL; est mauvais (pas de suppression p) sauf si vous pouvez vous assurer que votre code sera nettoyé. Cela risquerait de provoquer des memory leaks et, avec plusieurs de ces fuites, il est probable que le code soit lent.
  4. Vous voudrez peut-être faire cette class Null {}; Null _NULL; class Null {}; Null _NULL; puis surchargez l’opérateur = et l’opérateur! = d’autres classes en fonction de votre situation.

Peut-être devriez-vous nous envoyer quelques détails sur le contexte pour vous aider à mieux utiliser l’option 4.

Arpan

Vous pouvez définir n’importe quel pointeur sur NULL , bien que NULL soit simplement défini sur 0 en C ++:

 myObject *foo = NULL; 

Notez également que NULL est défini si vous incluez des en-têtes standard, mais qu’il n’est pas intégré au langage lui-même. Si NULL n’est pas défini, vous pouvez utiliser 0 à la place ou inclure ceci:

 #ifndef NULL #define NULL 0 #endif 

En passant, si vous voulez vraiment définir un object, et non un pointeur, sur NULL , vous pouvez en savoir plus sur le modèle d’object Null .

“un object” de quel type?

Vous pouvez certainement assigner NULL (et nullptr ) aux objects de types pointeurs, et son implémentation est définie si vous pouvez affecter NULL à des objects de types arithmétiques.

Si vous entendez des objects d’un type de classe, la réponse est NON (sauf les classes ayant des types operator= acceptant le type pointeur ou arithmétique)

“empty” est plus plausible, car de nombreux types ont à la fois une affectation de copie et une construction par défaut (souvent implicitement). Pour voir si un object existant ressemble à un object construit par défaut, vous aurez également besoin d’un bool operator== approprié bool operator==