C++ : différents modes de passage de paramètres

C++ : différents modes de passage de paramètres

par Eric Paquette,
Nombre de réponses : 0

En C++, il est possible de passer des paramètres aux fonctions de différentes façons. 

Par objet :

void myFunction(Eigen::MatrixXd V, Eigen::MatrixXi F) {
...
}
Eigen::MatrixXd myV;
Eigen::MatrixXi myF
myFunction(myV, myF);

Dans ce cas, si les paramètres V et F sont modifiés à l'intérieur de la fonction, cela n'aura aucun effet sur les variables passées en paramètre (myV et myF ne changent pas de valeur). Autre fait à noter : il y aura une copie des matrices myV et myF vers les objets V et F (allocation de mémoire, copie des valeurs). Ceci demande donc plus de temps de traitement. Il est rare que ça soit une bonne chose à faire.

Par référence :

void myFunction(Eigen::MatrixXd & V, Eigen::MatrixXi & F) {
...
}
Eigen::MatrixXd myV;
Eigen::MatrixXi myF
myFunction(myV, myF);
Dans ce cas, si les paramètres V et F sont modifiés à l'intérieur de la fonction, cela modifie directement les variables passées en paramètre (myV et myF changent de valeur). Ici, il n'y a aucune copie des valeurs dans la matrice : c'est plus efficace.

Si nous voulons éviter que myV et myF soient modifiés dans la fonction, mais que nous voulons garder l'efficacité du passage par référence, une bonne pratique est d'utiliser « const » pour indiquer au compilateur que nous voulons garantir que les paramètres doivent rester constants :

void myFunction( const Eigen::MatrixXd & V, const Eigen::MatrixXi & F) 

Il devient alors impossible de modifier V et F dans la fonction (le compilateur va envoyer une erreur et le code ne compilera pas si l'on essaie de modifier V et F).

Par pointeur :

void myFunction(Eigen::MatrixXd * V, Eigen::MatrixXi * F) {
...
}
Eigen::MatrixXd myV;
Eigen::MatrixXi myF
myFunction( & myV, & myF);
Dans ce cas, si les paramètres V et F sont modifiés à l'intérieur de la fonction, cela modifie directement les variables passées en paramètre (myV et myF changent de valeur). Ici, il n'y a aucune copie des valeurs dans la matrice : c'est plus efficace.

Toutefois, la syntaxe pour passer myV et myF est différente (il faut retrouver le pointeur avec l'opérateur &) de même que pour modifier V et F dans la fonction (il faut déréférencer le pointeur, par exemple en utilisant (*V) pour accéder à l'objet, ses attributs et ses méthodes).