web-dev-qa-db-fra.com

esperluette (&) à la fin de la variable, etc.

Je suis un noob C++ et j'ai un problème de compréhension de la syntaxe c ++ dans un code. Maintenant, je suis assez confus.

class date
{
private:
int day, month, year;
int correct_date( void );
public:
void set_date( int d, int m, int y );
void actual( void );
void print( void );
void inc( void );
friend int date_ok( const date& );
};

En ce qui concerne le caractère '&', je comprends son utilisation générale comme référence, adresse et opérateur logique ...

par exemple int * Y = & X

Quelle est la signification d'un opérateur & à la fin du paramètre?

friend int date_ok( const date& );

Merci

modifier:

Merci pour les réponses. Si j'ai bien compris, le nom de la variable a simplement été omis car il ne s'agit que d'un prototype. Pour le prototype, je n'ai pas besoin du nom de variable, c'est facultatif. Est-ce exact?

Cependant, pour la définition de la fonction, j'ai certainement besoin du nom de la variable, non?

31
snipor

const date& acceptée par la méthode date_ok signifie que date_ok prend une référence de type const date. Cela fonctionne de façon similaire aux pointeurs, sauf que la syntaxe est légèrement plus .. sucrée

dans votre exemple, int* Y = &x fait de Y un pointeur de type int * puis lui attribue l'adresse de x. Et quand je voudrais changer la valeur de "quoi que ce soit à l'adresse pointée par Y" je dis *Y = 200;

donc,

int x = 300;
int *Y = &x;
*Y = 200; // now x = 200
cout << x; // prints 200

À la place, j'utilise maintenant une référence

int x = 300;
int& Y = x;
Y = 200; // now x = 200
cout << x; // prints 200
38
Aniket Inge

Dans ce contexte, & n'est pas un opérateur. Cela fait partie du type.

Pour tout type donné T, le type T& est une "référence à T".

Le symbole & en fait a trois significations en C++ , et il est important de reconnaître ces différentes significations.

  • "adresse de" lorsqu'elle est appliquée à une expression
  • "référence" lorsqu'elle fait partie d'un type
  • "ET au niveau du bit" lorsqu'il est appliqué à deux nombres

De même, * a au moins trois significations, et une fois que vous les aurez saisies, vous aurez des pointeurs et des références vers le bas. :-)

Si j'ai bien compris, le nom de la variable y a simplement été omis car il ne s'agit que du prototype. Et pour le prototype, je n'ai pas besoin du nom de la variable, c'est facultatif. Est-ce exact?

Oui.

Cependant, pour la définition de la fonction, j'ai certainement besoin du nom de la variable, non?

Non. Bien que vous en ayez généralement envie (sinon à quoi ça sert?!) Il y a des circonstances dans lesquelles vous ne le faites pas, généralement lorsque vous n'avez introduit le paramètre que pour vous engager dans une supercherie liée à la surcharge.

Mais en parlant purement technique, vous pouvez omettre le nom de l'argument de la déclaration et/ou de la définition comme vous le souhaitez.

24

Donc, pour commencer, je pense que vous pourriez être plus confus dans la mesure où l'auteur de ce code a omis quelque chose de très important (bien que facultatif): le nom de la variable.

Réécrivons cela:

friend int date_ok( const date& check);

Le type de la variable 'check' est const date&. Nous la transmettons à la fonction en tant que "référence constante". En d'autres termes, c'est un alias pour tout ce que nous avons passé (via la magie du pointeur), mais nous ne pouvons pas le modifier.

La raison pour laquelle nous faisons cela est que nous pouvons passer de gros objets (comme un std::vector) en fonctions sans en faire une copie. Le passage par valeur entraîne une opération de copie. Pour un int, cela n'a pas d'importance (cela ne prend presque pas de temps), pour une classe, cela pourrait être plus important. La règle de base est de toujours passer des objets par référence, et de les passer par référence const si vous n'avez pas l'intention de les modifier. (Cette règle empirique ignore la sémantique des mouvements, mais je suppose que vous ne le savez pas encore).

5
Mark

l'utilisation de & à la fin d'un type dans un prototype de fonction permet de passer par référence, au lieu de passer par valeur (copie). De cette façon, vous pouvez modifier l'objet date dans la fonction ami.

friend int date_ok( const date& );

Ami: Dans votre définition de classe, cela signifie que vous dites qu'une fonction date_ok peut accéder à tous les paramètres de votre classe. En fait, cela signifie qu'il est presque un membre de votre classe, alors pensez à ajouter cette fonction ami plutôt qu'une fonction membre. (sauf si vous avez d'autres bonnes raisons, comme ne pas polluer votre classe avec des définitions étrangères)

Si oui, envisagez également d'en faire une fonction statique, elle pourrait avoir le même accès aux tripes de votre classe d'objet date. Mais ce serait plus naturel.

cf. le livre "101 C++ coding standard". Préfère définir les fonctions des éléments statiques, il favorise le couplage lâche.

1
Stephane Rolland

Merci pour les réponses. Si j'ai bien compris, le nom de la variable y a simplement été omis car il ne s'agit que du prototype. Et pour le prototype, je n'ai pas besoin du nom de la variable, c'est facultatif. Est-ce exact?

Cependant, pour la définition de la fonction, j'ai certainement besoin du nom de la variable, non?

0
snipor