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 ?
- Valeur par défaut du paramètre de fonction (4 réponses )
Réponses
Trop de publicités?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.
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 !).
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