330 votes

Où mettre la valeur de paramètre par défaut en C++ ?

Quelle est la place pour la valeur de paramètre par défaut ? Juste dans la définition de fonction, ou déclaration ou les deux places ?

340voto

Marcelo Cantos Points 91211

Les valeurs de paramètre par défaut doivent figurer sur la déclaration, puisque c’est la seule chose qui voit l’appelant.

EDIT : Comme d’autres font remarquer, vous pouvez avoir l’argument sur la définition, mais je conseille d’écrire tout le code comme si ce n’était pas vrai.

101voto

sharptooth Points 93379

Vous pouvez faire non plus, mais jamais les deux. Généralement vous faire à la déclaration de fonction et ensuite tous les appelants peuvent utiliser cette valeur par défaut. Toutefois vous pouvez le faire à la définition de fonction au lieu de cela et ensuite seulement de ceux qui voient la définition sera en mesure d’utiliser la valeur par défaut.

94voto

6502 Points 42700

Le lieu plus utile est dans la déclaration (.h) afin que tous les utilisateurs verront.

Certaines personnes peuvent m’exprimer dans les valeurs par défaut dans la liste d’arguments de fonction répétées :

Cependant, cela signifie duplication et ajoutera la possibilité d’avoir le commentaire pas synchronisé avec le code (ce qui est pire que décommenté code ? code avec trompeuses commentaires !).

43voto

GeertVc Points 306

Même si c'est un "vieux" thread, je tiens encore à ajouter les éléments suivants:

J'ai connu le cas suivant:

  • Dans le fichier d'en-tête de la classe, j'ai eu
int SetI2cSlaveAddress( UCHAR addr, bool force );
  • Dans le fichier source de la classe, j'ai eu
int CI2cHal::SetI2cSlaveAddress( UCHAR addr, bool force = false )
{
   ...
}

Comme on peut le voir, j'avais mis la valeur par défaut du paramètre "force" dans le fichier source de classe, pas dans la classe d'en-tête de fichier.

Ensuite, j'ai utilisé cette fonction dans une classe dérivée comme suit (classe dérivée de a hérité de la classe de base dans une voie publique):

SetI2cSlaveAddress( addr );

en supposant qu'il allait prendre la "force" paramètre "false" pour le "pour soi'.

Cependant, le compilateur (mis en c++11 mode) se sont plaints et m'a donné l'erreur de compilation suivant:

/home/.../mystuff/domoproject/lib/i2cdevs/max6956io.cpp: In member function 'void CMax6956Io::Init(unsigned char, unsigned char, unsigned int)':
/home/.../mystuff/domoproject/lib/i2cdevs/max6956io.cpp:26:30: error: no matching function for call to 'CMax6956Io::SetI2cSlaveAddress(unsigned char&)'
/home/.../mystuff/domoproject/lib/i2cdevs/max6956io.cpp:26:30: note: candidate is:
In file included from /home/geertvc/mystuff/domoproject/lib/i2cdevs/../../include/i2cdevs/max6956io.h:35:0,
                 from /home/geertvc/mystuff/domoproject/lib/i2cdevs/max6956io.cpp:1:
/home/.../mystuff/domoproject/lib/i2cdevs/../../include/i2chal/i2chal.h:65:9: note: int CI2cHal::SetI2cSlaveAddress(unsigned char, bool)
/home/.../mystuff/domoproject/lib/i2cdevs/../../include/i2chal/i2chal.h:65:9: note:   candidate expects 2 arguments, 1 provided
make[2]: *** [lib/i2cdevs/CMakeFiles/i2cdevs.dir/max6956io.cpp.o] Error 1
make[1]: *** [lib/i2cdevs/CMakeFiles/i2cdevs.dir/all] Error 2
make: *** [all] Error 2

Cependant, quand j'ai ajouté le paramètre par défaut dans l' en-tête de fichier de la classe de base:

int SetI2cSlaveAddress( UCHAR addr, bool force = false );

et supprimés à partir du fichier source de la classe de base:

int CI2cHal::SetI2cSlaveAddress( UCHAR addr, bool force )

ensuite, le compilateur était heureux et tout le code a fonctionné comme prévu (je pourrais donner à un ou deux paramètres à la fonction SetI2cSaveAddress())!

Donc, non seulement pour l'utilisateur d'une classe, il est important de mettre la valeur par défaut d'un paramètre dans le fichier d'en-tête, également la compilation et fonctionnel sage apparemment, il semble être un must!

Juste mes 2 ct.

Meilleur rgds,

--Geert

11voto

justin Points 72871

la déclaration est généralement la plus « utile », mais cela dépend de comment vous voulez utiliser la classe.

les deux n’est pas valide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X