web-dev-qa-db-fra.com

Qu'est-ce qu'une fonction "operator int"?

Qu'est-ce que la fonction "operator int" ci-dessous? Qu'est ce que ça fait?

class INT
{
   int a;

public:
   INT(int ix = 0)
   {
      a = ix;
   }

   /* Starting here: */
   operator int()
   {
      return a;
   }
   /* End */

   INT operator ++(int)
   {
      return a++;
   }
};
33
ankit

Le code en gras est un opérateur de conversion. (AKA opérateur de cast )

Il vous permet de convertir votre type INT personnalisé en un autre type (dans ce cas, int) sans avoir à appeler explicitement une fonction de conversion spéciale.

Par exemple, avec l'opérateur convert, ce code compilera:

INT i(1234);
int i_2 = i; // this will implicitly call INT::operator int()

Sans l'opérateur de conversion, le code ci-dessus ne se compilera pas et vous devrez faire autre chose pour passer d'un INT à un int, comme:

INT i(1234);
int i_2 = i.a;  // this wont compile because a is private
27
John Dibling

operator int() est un opérateur de conversion, qui permet d'utiliser cette classe à la place d'un int. Si un objet de ce type est utilisé à un endroit où un int (ou un autre type numérique) est attendu, alors ce code sera utilisé pour obtenir une valeur du type correct.

Par exemple:

int i(1);
INT I(2); // Initialised with constructor; I.a == 2
i = I;    // I is converted to an int using `operator int()`, returning 2.
16
Mike Seymour

Tout d'abord:

$ 12.3.1/1 - "Un constructeur déclaré sans le spécificateur de fonction explicite spécifie une conversion des types de ses paramètres au type de sa classe. Un tel constructeur est appelé constructeur de conversion."

Dans votre exemple, INT est une classe définie par l'utilisateur qui a un constructeur de conversion de "int".

Par conséquent, le code suivant est bien formé:

INT i(1024);     // direct initialization syntax

Cela signifie que vous pouvez obtenir un objet INT à partir d'un entier. Mais que faire, si l'objet INT doit être reconverti en entier? Transitivité?

On peut dire que la classe INT peut fournir une fonction membre pour retourner le membre entier encapsulé

int x = i.geta();

Ce n'est cependant pas très intuitif et ce n'est pas une approche standardisée. De plus, il n'est pas intuitif en ce qui concerne le fonctionnement des types intégrés dans de telles situations.

int z = 0;
int y1 = z; // copy initialization or
int y2(z);  // direct initialization
double d = (int )z; // explicit cast

Par conséquent, la norme permet une telle standardisation et intuitivité de la conversion des types définis par l'utilisateur en disant:

$ 12.3/2 - "Une fonction membre d'une classe X n'ayant pas de paramètres avec un nom de la forme [...]

opérateur conversion-type-id

[...] spécifie une conversion de X au type spécifié par l'ID de type de conversion. Ces fonctions sont appelées fonctions de conversion. Aucun type de retour ne peut être spécifié. Si une fonction de conversion est une fonction membre, le type de la fonction de conversion (8.3.5) est "fonction ne prenant aucun paramètre renvoyant conversion-type-id".

Cela rend tous les éléments suivants bien formés et conserve l'harmonie avec la façon dont les types intégrés fonctionnent est

int y1 = i; // copy initialization or
int y2(i);  // direct initialization
double d = (int )i; // explicit cast
4
Chubsdad

On dirait qu'il fait une classe INT qui se comporte un peu comme l'int entier normal, juste que certains autres opérateurs ne sont pas encore définis.

Est-ce un problème de devoirs?

4
John Smith

On dirait que c'est une question d'une salle de classe, donc je vous invite à consulter la documentation sur la façon de créer une classe.

class Foo
{
public
    Foo() {} // Constructor

    Foo operator++ {} // Operation ++ on foo like:
    // Foo foo;
    // foo++;
};
2
Wernight