Argument par défaut pour la référence de structure en C ++

Je veux donner une valeur par défaut à un paramètre de fonction, qui est une référence à une structure. Que puis-je donner comme valeur par défaut?

Première solution:

Si c’est une référence à une structure, alors vous devez lui donner une référence const , et faites ceci:

 struct A { //etc A(int, int); }; void f(int a, const A & = A(10,20) ) //const is necessary { //etc } 

Ce n’est pas très bon pour des raisons évidentes: cela rend le paramètre const (vous ne le voulez peut-être pas), et votre structure doit avoir un constructeur (vous ne l’avez peut-être pas).

Deuxième solution:

Donc, si vous ne voulez pas le rendre const , ou si vous ne voulez pas avoir de constructeur dans la structure, alors vous pouvez faire ceci:

 struct Point { int x, y, z; }; Point g_default_point = {10,20,30}; void g(int a, Point & p = g_default_point ) { //etc } 

Toujours pas bon. Définir une variable globale n’est pas une bonne idée.


Meilleure solution: définir une fonction de surcharge

 void g(int a, Point & p) { //your code } void g(int a) //this function would behave as if you opt for default value! { Point default_value = {10,20,30}; g(a, default_value); } 

Maintenant, cela ne vous oblige pas à faire le paramètre const , cela ne vous oblige pas non plus à avoir un constructeur dans votre structure.

Cela fonctionne en C ++ 0x:

 #include  struct structure { int x, y ; } ; int f(int a, structure &s = structure{10,20}) { return sx + sy ; } int main() { std::cout << f (99) << std::endl ; } 

Notez que s ne doit pas nécessairement être const . Voir http://ideone.com/sikjf .

Tu ne peux pas faire ça.

Toutes les références doivent être initialisées lorsqu’elles sont déclarées. Une référence est juste un autre nom d’une variable. Vous ne pouvez donc pas affecter une valeur par défaut au paramètre qui fait référence à une autre variable.

Si vous devez le faire, vous pouvez utiliser le pointeur à la place. Dans ce cas, vous pouvez affecter 0 au paramètre comme valeur par défaut.

Un object (auquel on peut faire référence), une référence existante. Si votre paramètre se trouve être une référence const, alors une expression résultant de ce type.

Pour illustrer:

 struct X { X operator+(const X&) const; }; X x1; X& x2; void f(X& x = x1); void f(X& x = x2); void f(const X& x = x1 + x1); 

Vous pouvez le faire si vous passez un object. int rowCount(const QModelIndex &parent = QModelIndex()) const; s’exécute de cette façon:

  • La première étape est l’évaluation d’expressions dans la fonction, où le constructeur d’object est appelé et la référence initialisée avec lui.

  • La deuxième étape est l’exécution du corps de la fonction, où l’object existe.

  • Troisième étape va à la fonction suivante, les objects créés à la première étape sont hors de scope, ainsi leurs destructeurs ont appelé.

Même const n’est pas nécessaire ici, mais la plupart des compilateurs vous avertiront que vous initialisez référence avec temporaire.

Cette solution ne fonctionnera pas avec les types qui n’ont pas de constructeur, int test (int &i=int()); échouera (au moins sur VisualStudio 2008, l’ error C2440: 'default argument' : cannot convert from 'int' to 'int &' )