30 votes

Pourquoi la surcharge de fonctions a-t-elle été ajoutée à C ++?

J'ai un fond C Je me demandais simplement pourquoi la surcharge de fonctions était ajoutée à C ++? C n’a pas de surcharge de fonction, mais C ++, quelle en était la nécessité?

Qu'est-ce qui a traversé l'esprit du concepteur de langage à cette époque?

54voto

Puppy Points 90818

Il augmente la facilité de maintenance. Si vous avez un type T et que vous appelez une fonction, alors vous avez besoin de changer de T, si la fonction a été surchargé pour le nouveau T ensuite, vous pouvez recompiler instantanément. En C, vous auriez à revenir en arrière et de creuser à travers tous les sites d'appel et de modifier la fonction appelée. Prendre sqrt(). Si vous voulez sqrt() float, alors vous devez changer de sqrtf().

Pas seulement ça, mais le volume et la complexité de C++de type de système est beaucoup plus qu'en C, et d'avoir à séparer les noms de fonction pour chaque surcharge épuiser rapidement le bassin raisonnable de noms de fonctions qui servent le même but, mais prendre des arguments différents, parce que maintenant il y a beaucoup plus d'arguments à prendre.

Par exemple, comparer le C et le C++ bibliothèques de chaînes de caractères. La chaîne C de la bibliothèque propose une méthode pour ajouter une chaîne à l' - strcat(). C++std::string::append a huit surcharges. Que voulez-vous appeler? append_a, append_b, etc? C'est ridicule - ils servent tous la même fonction, dans différentes manières.

Edit: Il est effectivement utile de mentionner que, append est un très mauvais exemple, de nombreux de la chaîne C++ surcharges sont très redondants. Cependant, c'est le cas plus général que cela et pas tous de ces surcharges redondant.

22voto

Stuart Golodetz Points 12679

Une bonne raison, en plus de ce DeadMG dit, c'est que si vous êtes à la rédaction d'un modèle de fonction par exemple des appels sqrt, alors vous avez besoin d'un générique de l'appel de sqrt -- il serait très difficile si vous avez eu à essayer et en quelque sorte de changer le nom d' sqrtf, sqrtd, etc., selon le type du paramètre de modèle. La surcharge permet de résoudre ce problème, parce que vous venez d'écrire, sqrt et permet au compilateur de savoir laquelle de surcharge, il devrait être à l'aide de:

template <typename T>
T sqrt_plus_one(T t) // contrived example
{
  return sqrt(t) + 1;
}

15voto

Nawaz Points 148870

Préféreriez-vous "choisir" un parmi abs / labs / llabs / fabs / fabsf / fabsl ou simplement abs () ?

Évidemment, abs () .

La surcharge de fonctions est donc un soulagement pour les programmeurs , la plupart du temps, en plus d'autres avantages.

12voto

NPE Points 169956

Vous pourriez obtenir la réponse directement de la bouche des chevaux: La Conception et l'Évolution de C++ par Bjarne Stroustrup consacre un chapitre entier à la surcharge, de son histoire, l'évolution, la conception des arbitrages et des décisions.

Je ne vais pas raconter l'histoire ici, mais la mention d'un couple d'intéressant faits historiques:

  • de l'opérateur et de surcharge de fonctions sont étroitement liées;
  • au début de C++, il y avait un mot-clé spécial (overload) qui devait être utilisé pour déclarer un identificateur de la surcharge;
  • surcharge de fonctions nécessite de type sûr de liens (c'est à dire le nom de mangling); lors de la première mise en œuvre, elle a permis de découvrir un nombre surprenant de lien erreurs existantes code C et C++ (pour citer Stroustrup, c'était comme "en cours d'exécution lint sur un programme en C pour la première fois-un peu embarrassant".)

3voto

DevSolar Points 18897

Essayez de trouver un moyen confortable de construire des objets s’il n’ya pas eu de surcharge de fonctions.

 std::string foo = "bar";
std::vector< std::string > myStringVector;
myStringVector.push_back( std::string() );
myStringVector.push_back( std::string( "hello" ) );
myStringVector.push_back( std::string( foo ) );
 

Un exemple insensé, bien sûr, mais il illustre ce point.

Un autre point serait la programmation par modèle. Vous ne pouvez pas créer de modèles génériques si vous devez attribuer un nom de fonction différent à chaque type de paramètre.

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