C plus plus
| Image manquante Langage_progr.png image:Langage_progr.png |
| Cet article fait partie de la série Langages de programmation |
| Langages à objets |
| Ada 95 - C++ - C# Common Lisp Delphi - Eiffel - Java Nice - Oz - Python Simula - Smalltalk Visual Basic |
| Langages impératifs |
| APL - ASP - Assembleur BASIC - C - COBOL Forth - FORTRAN - Logo Pascal - Perl - PHP |
| Langages fonctionnels |
| Erlang - Haskell ML/OCaml - Oz Lisp/Common Lisp Scheme |
| Langages déclaratifs |
| Clips - Oz - Prolog |
| Langages concurrents |
| Ada 95 - Erlang Java - Oz |
| Langages balisés |
| HTML - SGML - XML Dialectes XML S-expressions |
| Voir aussi |
| Conception - Codage Tests - Optimisations |
- Note : Le titre de cet article est incorrect à cause de limitations techniques. Le titre correct est C++.
| Sommaire |
Préliminaires
Le C++ est un langage de programmation à usage multiple. Ce langage permet la programmation sous de multiples paradigmes comme, par exemple, la programmation procédurale, la programmation orientée objet, la programmation générique. Au cours des années 1990, le C++ est devenu l'un des langages de programmation les plus populaires dans l'industrie informatique. Le langage C++ n'appartient à personne et par conséquent n'importe qui peut l'utiliser sans payer de droits.
Bjarne Stroustrup a développé le C++ au cours des années 1980, alors qu'il travaillait dans le laboratoire de recherche Bell d'AT&T. Il s'agissait en l'occurrence d'améliorer le langage C et il l'avait d'ailleurs nommé C with classes (« C avec des classes »). Les premières améliorations se concrétisèrent donc par l'ajout du support des classes, suivies par de nombreuses autres comme les fonctions virtuelles, la surcharge d'opérateurs, l'héritage (simple ou multiple), les « templates », la gestion d'exceptions...
Le langage C++ est normalisé par l'ISO. Sa première normalisation date de 1998 (ISO/IEC 14882:1998), et sa dernière de 2003 (ISO/IEC 14882:2003). La normalisation de 1998 standardise la base du langage (Core Language) ainsi que la bibliothèque C++ standard (C++ Standard Library). La normalisation de 2003 inclut également la Standard Template Library et la C Standard Library .
Il existe de nombreuses autres bibliothèques en C++ non incluses dans le standard. De plus, le C++ permet l'utilisation des nombreuses bibliothèques C existantes.
Fonctionnalités introduites par le C++
On peut considérer que le C++ « est du C » avec un ajout de fonctionnalités. Une remarque importante est à faire cependant : Certains programmes syntaxiquement corrects en C, ne le sont pas en C++.
Les fonctionnalités ajoutées sont :
- les déclarations reconnues comme instructions (repris dans C99) ;
- les opérateurs
newetdeletepour la gestion d'allocation mémoire ; - le type de données
bool(booléen) ; - les références ;
- le mot clé
constpour définir des constantes (repris par C à la fin des années 1980) ; - les fonctions
inline<code> ; - les paramètres par défaut dans les fonctions ;
- les référentiels lexicaux (namespace) et l'opérateur de résolution <code>:: ;
- les classes, ainsi que tout ce qui y est lié : l'héritage, les fonctions membres, les fonctions membres virtuelles, les constructeurs et le destructeur ;
- la surcharge des opérateurs ;
- les templates ;
- la gestion d'exceptions ;
- l'identification de type pendant l'exécution (RTTI : run-time type identification) ;
- le commentaire de fin de ligne introduit par « // » (existant dans BCPL, repris dans C99).
La compilation d'un programme en C++ effectue également un contrôle plus minutieux sur le typage.
Histoire du C++
Stroustrup a commencé à travailler sur du C avec classes en 1979. L'idée de créer un nouveau langage vient de l'expérience en programmation de Stroustrup pour sa thèse de doctorat. Stroustrup trouvait que Simula avait des fonctionnalités très utiles pour le développement de gros programmes mais qu'il était trop lent pour être utilisé en pratique (dû à un problème d'implémentation du compilateur Simula), tandis que BCPL était rapide mais de trop bas niveau et pas adapté au développement de gros logiciels. Quand Stroustrup commença à travailler dans les laboratoires de Bell, on lui demanda d'analyser le noyau UNIX en vue de faire du calcul distribué. Se rappelant sa thèse, Stroustrup commença à améliorer le langage C avec des fonctionnalités similaires à celle de Simula. C a été choisi parce qu'il est rapide, portable et d'usage général. Au départ, classe (avec encapsulation des données), classe dérivée, vérification des types renforcés (typage fort), inlining, et argument par défaut étaient des fonctionnalités ajoutées au C.
Comme Stroustrup développait le C avec classes, il a aussi écrit CFront, un compilateur qui génère du code source C a partir de code source C avec classes (C++). La première commercialisation fut en octobre 1985.
En 1983, le nom du langage fut changé de "C avec classes" en C++. Parmi les nouvelles fonctionnalités qui furent ajoutées au langage, il y avait les fonctions virtuelles, la surcharge des opérateurs et des fonctions, les références, les constantes, le contrôle du typage amélioré et un nouveau style de commentaire (//). En 1985 fut publiée la première édition de The C++ programming Language, apportant ainsi une référence importante au langage qui n'avait pas encore de standard officiel. En 1989, sortie de la version 2.0 du C++. Parmi les nouvelles fonctionnalités, il y avait l'héritage multiple, les classes abstraites, les fonctions membres statiques, les fonctions membres constantes, et les membres protégés. En 1990, The Annotated C++ Reference Manual fut publié apportant les bases du futur standard. Les ajouts de fonctionnalités tardifs comprennent les templates, les exceptions, les espace de noms, les nouvelles conversions et le type booléen.
Comme le langage C++ évoluait, la bibliothèque standard évoluait de concert. La première addition à la bibliothèque standard du C++ fut les flux d'E/S qui apporte les fonctionnalités nécessaires au remplacement des fonctions C traditionnelles telles que printf et scanf. Ensuite, parmi les additions les plus importantes, il y a la Standard Template Library.
Après des années de travail, un comité réunissant l'ANSI et l'ISO standardisa le C++ en 1998 (ISO/IEC 14882:1998). Pendant quelques années après la sortie officielle du standard, le comité traita le rapport de problèmes et publia une version corrigée du standard C++ en 2003.
Personne ne possède le langage C++. Il est libre de droit. Le document de standardisation n'est quant à lui pas disponible gratuitement.
La bibliothèque standard (C++ standard library)
La bibliothèque C++ standard est en grande partie un surensemble des fonctions disponibles dans la bibliothèque C standard. Elle englobe la STL qui met à la disposition du programmeur des outils puissants comme les collections et les itérateurs.
A l'origine, la STL était une bibliothèque développée par Hewlett-Packard. Dans la norme, celle-ci n'est pas appelée STL, car elle est considérée comme faisant partie de la bibliothèque C++ standard. Toutefois, beaucoup de personnes l'appellent encore de cette manière pour distinguer d'une part, les fonctions d'entrées/sorties comprises dans cette bibliothèque et, d'autre part, celles fournies par la bibliothèque C.
Comme pour le C, l'utilisation d'une bibliothèque se fait par l'intermédiaire de la directive #include (suivie du nom du fichier d'en-tête).
La programmation orientée objet en C++
Le C++ introduit des concepts de programmation orientée objet. Il offre pour ce faire les classes qui couvrent deux besoins essentiels :
- L'encapsulation,
- L'héritage, qui permet le polymorphisme.
L'encapsulation en C++
L'encapsulation permet de faire abstraction du fonctionnement interne (c'est-à-dire, l'implémentation) d'une classe et ainsi de ne se préoccuper que des services rendus par celle-ci. Le C++ implémente l'encapsulation en permettant de déclarer les membres d'une classe avec le mot réservé public, private ou protected. Ainsi, lorsqu'un membre est déclaré :
- public, il sera accessible depuis n'importe quelle fonction.
- private, il sera uniquement accessible d'une part, depuis les fonctions qui sont membres de la classe et, d'autre part, depuis les fonctions autorisées explicitement par la classe (par l'intermédiaire du mot réservé
friend). - protected, il aura les mêmes restrictions que s'il était déclaré private, mais il sera en revanche accessible par les classes filles.
Le C++ n'impose pas l'encapsulation des membres dans leurs classes. On pourrait donc déclarer tous les membres publics, mais en perdant une partie des bénéfices apportés par la programmation orientée objet. Il est de bon usage de déclarer toutes les données privées, ou au moins protégées, et de rendre publiques les méthodes agissant sur ces données. Ceci permet de cacher les détails de l'implémentation de la classe.
Exemples de programme
« Hello, world »
Voici l'exemple de Hello world donné dans The C++ Programming Language, Third Edition de Bjarne Stroustrup :
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
}
Déclaration de classe
class MessageInternet
{
private:
string m_sujet;
string m_expediteur;
string m_destinataire;
public:
MessageInternet (string sujet, string expediteur, string destinataire);
string sujet ();
string expediteur ();
string destinataire ();
};
Déclaration de templates
À quoi servent les templates ?
Avec les templates, on peut écrire des fonctions et des classes non typées. Les templates permettent d'écrire du code générique (généré suivant le type de donnée).
Pourquoi utiliser des templates ?
En programmation, il faut parfois écrire de nombreuses versions d'une même fonction ou classe suivant les types de données manipulées.
Par exemple, un tableau de int ou un tableau de double sont très semblables, les fonctions de tri ou de recherche dans ces tableaux sont identiques au type près.
En résumé, l'utilisation des templates permet de "paramétrer" le type des données manipulées.
Avantages à utiliser des templates :
- écritures uniques pour les fonctions et les classes. - moins d'erreur dû à la réécriture (copier-coller assassin!)
Exemple de templates :
Dans la bibliothèque standard C++, il y a de nombreux templates. On citera à titre d'exemple, les entrée/sorties, les chaînes de caractères ou les containers. Les classes string, istream, ostream et iostream sont toutes des instanciations de char type.
Les fonctions de recherche et de tri sont aussi des templates écrites et utilisables avec de nombreux types.
template<typename String> class Message {
public:
typedef String string_type;
private:
string_type m_sujet;
string_type m_expediteur;
string_type m_destinataire;
public:
Message(string_type sujet, string_type expediteur, string_type destinataire);
string_type sujet ();
string_type expediteur ();
string_type destinataire ();
};
typedef Message<string> MessageString; // MessageString est fonctionnellement équivalent à
// la classe MessageInternet ci-dessus
typedef Message<UnicodeString> MessageUnicode;
Bibliographie
- Bjarne Stroustrup, Le langage C++, 2003, ISBN 2-7440-7003-3
- Bjarne Stroustrup, The Design and Evolution of C++, Addison-Wesley, 1st Ed., 1994, ISBN 0201543303
Liens externes
- Livre en ligne sur le langage C++
- Wikibook sur la programmation en C++
- Coding style en C++
- Les méthodes de la classe String et Vector
- The C++ resources network (Anglais)
- Site officiel du compilateur libre GCC (Anglais)
- Site officiel de la librairie Standard C++ du compilateur GCC (Anglais)
- Cours sur le langage C++ (CCM)
