Votre exemple indique que vous créez une fonction virtuelle. Les arguments par défaut dans les fonctions virtuelles (particulièrement pures) ne sont pas une bonne idée, car ils ne sont pas pris en compte lorsque vous appelez une fonction surchargée.
struct A {
virtual void f(int = 4711) = 0;
};
struct B : A {
virtual void f(int) { /* ... */ }
};
Maintenant, si quelqu'un appelle f
sur un objet B
, il a de fournir l'argument - la valeur par défaut est pas utilisé. Vous devrez dupliquer l'argument par défaut dans la classe dérivée, ce qui crée des redondances moche. Au lieu de cela, vous pouvez utiliser le modèle d'interface non-virtuelle
struct A {
void f(int a) {
int out;
f(a, out);
}
void f(int a, int &out) {
doF(a, out);
}
protected:
virtual void doF(int a, int out&) = 0;
};
L'utilisateur peut maintenant appeler f
avec un, et avec deux arguments, quel que soit le type de classe qu'il appelle la fonction, et qui mettent en place A
ne pas s'inquiéter de l'argument par défaut. En utilisant la surcharge au lieu des arguments par défaut, vous n'avez pas besoin de vous casser la tête autour des valeurs ou des temporaires.
Si vous voulez qu'il soit null, alors vous avez besoin d'un pointeur et non d'une référence. –
Je suis avec Mike à ce sujet. Voir [ma réponse] (http://stackoverflow.com/questions/3190571/c-int-reference-question/3190603#3190603). – sbi
Je le reprends (et j'ai supprimé ma réponse). Sauf pour Johannes tout le monde a négligé le «virtuel». Ce n'est pas une bonne idée d'avoir des arguments par défaut pour les fonctions 'virtual'. – sbi