Vérifié contenu

C ++

Sujets connexes: Programmation informatique

Saviez-vous ...

SOS Enfants a fait cette sélection Wikipedia aux côtés d'autres écoles des ressources . Visitez le site Web d'enfants SOS au http://www.soschildren.org/

C ++
C plus plus book.jpg
Le C ++ Programming Language, écrit par son architecte, est le livre fondamental sur la langue.
Paradigm (s) Multi-paradigme: de procédure, fonctionnel, orienté objet, générique
Paru dans 1983
Conçu par Bjarne Stroustrup
Promoteur
  • Bjarne Stroustrup
  • Bell Labs
  • ISO / IEC JTC1 / SC22 / WG21


Version stable ISO / IEC 14882: 2011 (2011)
Typing discipline Statique, dangereux, nominatif
Les grandes implémentations C ++ Builder, LLVM Clang, Comeau C / C ++, GCC, Intel C ++ Compiler, Microsoft Visual C ++, Sun Studio
Dialectes Embedded C ++, C ++ managé, C ++ / CLI, C ++ / CX
Influencé Perl , LPC, Lua, Pike, Ada 95, Java , PHP, D, C99, C #, Falcon, Seed7
OS Croix-plate-forme (multi-plateforme)
Habituel les extensions de fichier .h .hh .hpp .hxx .h ++ .cpp .cc .cxx .c ++
  • Nouvelles, le statut et la discussion sur les standard C ++
  • Programmation C ++ au Wikibooks

C ++ (prononcé "voir plus plus") est un statiquement typé, forme libre, multi-paradigme, compilé, usage général langage de programmation . Il est considéré comme une langue de niveau intermédiaire, car il comprend à la fois de haut niveau et bas niveau des fonctionnalités du langage. Développé par Bjarne Stroustrup à partir de 1979 au Bell Labs, C ++ a été initialement nommé C avec des classes, ajoutant caractéristiques orientées objet, comme les classes, et d'autres améliorations au langage de programmation C . La langue a été rebaptisé C ++ en 1983, comme un jeu de mots impliquant la opérateur incrément.

C ++ est un des langages de programmation les plus populaires et est mis en œuvre sur une grande variété de plates-formes matérielles et systèmes d'exploitation. Comme un compilateur efficace de code natif, ses domaines d'application comprennent les logiciels, logiciels d'application, pilotes de périphériques, logiciels embarqués, serveur de haute performance et les applications clientes, et des logiciels de divertissement tels que les jeux vidéo . Plusieurs groupes fournissent à la fois libres et propriétaires C ++ compilateur logiciel, y compris la Projet GNU, Microsoft, Intel et Embarcadero Technologies. C ++ a considérablement influencé de nombreux autres langages de programmation populaires, notamment C # et Java . Autres langues succès tels que Objective-C, très différent la syntaxe et l'approche de l'ajout de classes à C .

C ++ est également utilisé pour conception du matériel, où le design est d'abord décrit en C ++, puis analysé, architecturalement contraint, et prévu de créer un inscrivez-transfert niveau description du matériel de langue via synthèse de haut niveau.

La langue a commencé comme améliorations à C , ajoutant d'abord classes, puis fonctions virtuelles, surcharge de l'opérateur, l'héritage multiple, modèles et la gestion des exceptions, entre autres caractéristiques. Après des années de développement, la norme ++ langage de programmation C a été ratifiée en 1998 en tant que norme ISO / IEC 14882 : 1998. La norme a été modifiée par la technique 2003 rectificatif, ISO / IEC 14882: 2003. La norme actuelle étendant C ++ avec de nouvelles fonctionnalités a été ratifié et publié par ISO en Septembre 2011, ISO / IEC 14882 : 2011 (officieusement connu sous le nom C ++ 11).

Histoire

Bjarne Stroustrup, créateur du C ++

Bjarne Stroustrup, un scientifique danois et britannique ordinateur formé, a commencé son travail sur "C avec des classes" en 1979. L'idée de créer une nouvelle langue originaire de l'expérience de Stroustrup dans la programmation pour son doctorat thèse. Stroustrup a constaté que Simula avait des caractéristiques qui ont été très utiles pour le développement de logiciels grand, mais la langue était trop lente pour une utilisation pratique, tandis que BCPL était rapide mais faible niveau trop pour être approprié pour le développement de logiciels grand. Lorsque Stroustrup commencé à travailler dans AT & T Bell Labs, il avait le problème de l'analyse de l' UNIX noyau par rapport à calcul distribué. Se souvenir de son doctorat expérience, Stroustrup a entrepris de renforcer la C avec la langue Simula caractéristiques semblables. C a été choisi parce qu'il était polyvalent, rapide, portable et largement utilisé. Outre C et Simula, d'autres langues qui lui ont été inspirés Algol 68, Ada, CLU et ML. Dans un premier temps, la classe, la classe dérivée, typage fort, inline, et caractéristiques d'argument par défaut ont été ajoutés à C par l'intermédiaire de la Stroustrup C ++ pour le compilateur C, Cfront. La première mise en œuvre commerciale de C ++ a été libéré le 14 Octobre 1985.

En 1983, le nom de la langue a été changé de C avec des classes C ++ (++ étant le opérateur incrément C). Les nouvelles fonctionnalités ont été ajoutées, notamment fonctions virtuelles, nom de fonction et surcharge d'opérateur, les références, les constantes, sans magasin contrôlé par l'utilisateur contrôle la mémoire, type amélioré le contrôle, et le style de BCPL seule ligne commente avec deux barres obliques ( // ). En 1985, la première édition du Le C ++ Programming Language a été libéré, fournissant une référence importante à la langue, car il ne était pas encore une norme officielle. La version 2.0 du C ++ est venu en 1989 et la deuxième édition mise à jour du langage de programmation C ++ a été publié en 1991. Nouvelles fonctionnalités incluses héritage multiple, classes abstraites, les fonctions membres statiques, fonctions membres const, et les membres protégées. En 1990, le Manuel de référence de The Annotated C a été publié. Ce travail est devenu la base de la future norme. Longs fin ajouts inclus modèles, exceptions, les espaces de noms, nouvelle plâtres, et un Type booléen.

Comme le langage C ++ a évolué, la bibliothèque standard évolué avec elle. Le premier ajout à la bibliothèque standard du C était le Volet I / O bibliothèque qui a fourni des installations pour remplacer les fonctions traditionnelles de C tels que printf et scanf. Par la suite, parmi les additions les plus importants à la bibliothèque standard, avait une grande quantité de la Template Library standard.

C ++ est parfois appelé un langage hybride.

Il est possible d'écrire orientée objet ou un code de procédure dans le même programme en C ++. Cela a causé une certaine inquiétude que certains programmeurs C ++ sont encore à écrire du code de procédure, mais sont sous l'impression que ce est orienté objet, tout simplement parce qu'ils utilisent C ++. Souvent, ce est un amalgame des deux. Cela provoque généralement la plupart des problèmes lorsque le code est revisité ou de la tâche est prise en charge par un autre codeur.

C ++ continue d'être utilisé et est l'un des langages de programmation privilégiées pour développer des applications professionnelles.

Étymologie

Selon Stroustrup: "le nom signifie la nature évolutive des changements de C". Pendant la période de développement de C ++, la langue avait été dénommé "nouveau C", puis "C avec des classes". Le nom définitif est crédité Rick Mascitti (mi-1983) et a été utilisé la première fois en Décembre 1983. Lorsque Mascitti a été interrogé de manière informelle en 1992 à propos de la nomination, il a indiqué qu'il a été donné dans un esprit pince-sans-rire. Il émane du "++" de C opérateur (qui incrémente le une valeur de variable) et un commune convention de nommage de l'utilisation de «+» pour indiquer un programme informatique améliorée. Une plaisanterie va que le nom lui-même a un bug: en raison de l'utilisation de après -increment, qui incrémente la valeur de la variable, mais évalue à la valeur non incrémentée, C ++ ne est pas mieux que C, et de la pré-incrémentation ++ forme C aurait été utilisé à la place. Il n'y a pas langage appelé "C plus". ABCL / c + était le nom d'un langage de programmation plus tôt, sans rapport. Quelques autres langues ont été nommés de façon similaire à C ++, notamment C-- et C #.

Standardisation

Année C Standard Nom informel
1998 ISO / IEC 14882: 1998 C ++ 98
2003 ISO / IEC 14882: 2003 C ++ 03
2007 ISO / IEC TR 19768: 2007 C ++ TR1
2011 ISO / IEC 14882: 2011 C ++ 11

En 1998, le comité du C des normes (la ISO / CEI JTC1 / SC22 / WG21 groupe de travail) normalisé de C ++ et publié la norme ISO / IEC 14882 internationale: 1998 (officieusement connu comme C ++ 98). Depuis quelques années après la sortie officielle de la norme, le comité a traité des rapports de défauts, et en 2003 a publié une version corrigée de la norme du C, ISO / IEC 14882: 2003. En 2005, un rapport technique, appelée " Rapport Bibliothèque technique 1 "(souvent connu comme TR1 pour faire court), a été libéré. Alors que pas une partie officielle de la norme, il a précisé un certain nombre d'extensions à la bibliothèque standard, qui ont été devrait être inclus dans la prochaine version de C ++.

La dernière révision majeure de la norme du C, C ++ 11 (anciennement connu sous le nom C ++ 0x) a été approuvé par l'ISO / CEI le 12 Août 2011. Il a été publié en 14882: 2011. Il ya des plans pour un mineur (C ++ 14) et une révision majeure (C ++ 17) à l'avenir.

C ++ 14 est le nom utilisé pour la prochaine révision. C ++ 14 est prévu pour être une petite extension sur C ++ 11, mettant en vedette principalement des corrections de bugs et de petites améliorations, de façon similaire à la façon dont C ++ 03 est une petite extension pour C ++ 98. Alors que le nom 'C ++ 14' implique une libération en 2014, cette date ne est pas fixée.

Philosophie

En La conception et l'évolution du C ++ (1994), Bjarne Stroustrup décrit quelques règles qu'il a utilisés pour la conception de C ++:

  • C ++ est conçu pour être un langage typé statiquement, usage général qui est aussi efficace et portable C
  • C ++ est conçu pour soutenir directement et globalement plusieurs styles de programmation ( la programmation procédurale, abstraction de données, la programmation orientée objet, et programmation générique)
  • C ++ est conçu pour donner la choix de programmation, même si cela permet pour le programmeur de choisir de manière incorrecte
  • C ++ est conçu pour être compatible avec C autant que possible, donc fournissant une transition en douceur à partir de C
  • C ++ évite fonctionnalités plateforme spécifique ou un but pas générale
  • C ++ ne encourt frais généraux pour les fonctions qui ne sont pas utilisés (le "zéro-frais généraux»)
  • C ++ est conçu pour fonctionner sans un environnement de programmation sophistiquée

A l'intérieur de la C Object Model (Lippman, 1996) décrit le programme C ++ comment compilateurs peuvent convertir déclarations dans une mise en mémoire. auteurs de compilation sont toutefois libres d'appliquer la norme dans leur propre manière.

Bibliothèque standard

Le 1998 ANSI / ISO C ++ standard se compose de deux parties: la langue et le noyau Bibliothèque standard de C; celui-ci comprend plus de la Standard Template Library (STL) et une version légèrement modifiée de la bibliothèque standard C. Beaucoup de bibliothèques C ++ existent qui ne sont pas partie de la norme, et, en utilisant la spécification de liaison, les bibliothèques peuvent même être écrits dans des langages tels que BASIC , C , Fortran, ou Pascal. Lequel de ces sont pris en charge est compilateur-dépendante.

La bibliothèque standard C de incorpore la bibliothèque standard C avec quelques petites modifications pour le rendre optimisée avec le langage C ++. Une autre grande partie de la bibliothèque de l'C est basé sur la STL. Ceci permet d'obtenir de tels outils utiles comme conteneurs (par exemple des vecteurs et listes), itérateurs de fournir ces conteneurs avec l'accès et semblable à un tableau des algorithmes pour effectuer des opérations telles que la recherche et le tri. En outre cartes (multi) ( tableaux associatifs) et (multi-ensembles) sont prévus, qui interfaces compatibles exportation. Par conséquent, il est possible, en utilisant des modèles, à écrire des algorithmes génériques qui fonctionnent avec ne importe quel récipient ou sur ne importe quelle séquence définie par itérateurs. Comme en C, la caractéristiques de la bibliothèque sont accessibles en utilisant le #include directive pour y inclure une tête standard. C ++ fournit 105 têtes standard, dont 27 sont obsolètes.

La STL était à l'origine une bibliothèque tiers de HP et plus tard SGI, avant son incorporation dans le standard C ++. Le principal architecte de la STL est Alexander Stepanov, qui a expérimenté avec des algorithmes génériques et conteneurs pour de nombreuses années. Quand il a commencé avec C ++, il a finalement trouvé un langage où il était possible de créer des algorithmes génériques (par exemple, STL tri) qui effectuent encore mieux que, par exemple, le C Qsort de la bibliothèque standard, grâce à C ++ caractéristiques comme l'utilisation inline et compile- contraignant temps au lieu de pointeurs de fonction. La norme ne fait pas référence à lui comme "STL", car il ne est qu'une partie de la bibliothèque standard, mais le terme est encore largement utilisé pour le distinguer du reste de la bibliothèque standard (entrée / cours d'eau de sortie, l'internationalisation, de diagnostic, la bibliothèque sous-ensemble C, etc.).

La plupart des compilateurs C ++ fournir une implémentation de la bibliothèque standard C ++, y compris la STL. implémentations de compilation indépendant de la STL, comme STLPort, existent également. D'autres projets produisent également différentes implémentations personnalisées de la bibliothèque standard C ++ et la STL avec divers objectifs de conception.

caractéristiques linguistiques

C ++ hérite de plus La syntaxe de C. Ce qui suit est la version de Bjarne Stroustrup de la Bonjour programme mondial qui utilise le Bibliothèque standard flux installations de C à écrire un message à sortie standard:

 # Include 
 
 int main ()
 {
    std :: cout << "Bonjour tout le monde! \ n";
 }

Dans les fonctions qui définissent un type de retour non nulle, le défaut de retourner une valeur avant que le contrôle atteint la fin des résultats de la fonction dans comportement indéfini (compilateurs fournissent généralement les moyens d'émettre un diagnostic dans un tel cas). La seule exception à cette règle est la main fonction, qui renvoie implicitement une valeur de zéro.

Les opérateurs et la surcharge d'opérateur

Les opérateurs qui ne peuvent être surchargés
Opérateur Symbole
opérateur de résolution de portée ::
Opérateur conditionnel ?:
opérateur point .
Membre opérateur de sélection *.
Opérateur "sizeof" taille de
Opérateur "typeid" typeid

C ++ fournit plus de 35 opérateurs, couvrant l'arithmétique de base, manipulation de bits, indirect, des comparaisons, des opérations logiques et d'autres. Presque tous les opérateurs peuvent être surchargé pour les types définis par l'utilisateur, avec quelques exceptions notables comme l'accès des membres ( . et .* ) ainsi que l'opérateur conditionnel. Le riche ensemble d'opérateurs surchargeable est au cœur de l'aide de C ++ comme un spécifique au domaine de la langue. Les opérateurs surchargeable sont également un élément essentiel de nombreux C ++ techniques de programmation avancées, telles que pointeurs intelligents. Surcharge un opérateur ne change pas la priorité des calculs impliquant l'opérateur, ni ne change le nombre d'opérandes que les utilisations de l'opérateur (l'un des opérandes peuvent cependant être ignorées par l'opérateur, mais il sera évalué avant l'exécution). Surchargé " && "et" || "opérateurs perdent leur court-circuit de la propriété d'évaluation.

Gestion de la mémoire

C ++ prend en charge quatre types de gestion de la mémoire:

  • Allocation de mémoire statique. Un variable statique est attribuée une valeur au moment de la compilation, et le stockage alloué à un endroit fixe avec le code exécutable. Ceux-ci sont déclarées avec le mot-clé "statique" (dans le sens de stockage statique, et non pas dans le sens de la déclaration d'une variable de classe).
  • Allocation de mémoire automatique. Une variable automatique est simplement déclarée avec son nom de classe, et le stockage est alloué sur la pile lorsque la valeur est affectée. Le constructeur est appelé quand la déclaration est exécutée, le destructeur est appelé lorsque la variable est hors de portée, et après le destructeur de la mémoire allouée est automatiquement libéré.
  • Allocation dynamique de mémoire. Le stockage peut être allouée de façon dynamique sur la tas en utilisant gestion de la mémoire manuelle - appelle normalement nouveau supprimer (si les appels à l'ancienne C tels que malloc () et free () sont toujours pris en charge).
  • Avec l'utilisation d'une bibliothèque, collecte des ordures est possible. Le Boehm garbage collector est couramment utilisé à cette fin.

L'amende contrôle sur la gestion de la mémoire est similaire à C, mais en contraste avec les langues qui ont l'intention de cacher des détails de la programmation, tels que Java, Perl, PHP et Ruby.

Modèles

Les modèles permettent de C programmation générique. C ++ prend en charge les modèles de fonction et de classe. Les modèles peuvent être paramétrées par types, constantes à la compilation, et d'autres modèles. Les modèles de C sont mises en œuvre par l'instanciation au moment de la compilation. Pour instancier un modèle, les compilateurs substituent arguments spécifiques pour les paramètres d'un modèle pour générer une fonction béton ou instance de classe. Certaines substitutions ne sont pas possibles; ceux-ci sont éliminés par une politique de résolution de surcharge décrite par l'expression " panne de substitution ne est pas une erreur "(SFINAE). Les modèles sont un outil puissant qui peut être utilisé pour la programmation générique, métaprogrammation modèle, et l'optimisation de code, mais ce pouvoir implique un coût. Utiliser un modèle peut augmenter la taille du code, parce que chaque instanciation de modèle produit une copie du code de modèle: un pour chaque ensemble d'arguments de modèle. Ce est en contraste avec Run-Time génériques vu dans d'autres langues (par exemple, Java) où au moment de la compilation du type est effacé et un corps de modèle unique est préservée.

Les modèles sont différents de macros: alors que ces deux fonctionnalités de langage de compilation permettent la compilation conditionnelle, les modèles ne sont pas limités à la substitution lexicale. Les modèles sont conscients de la sémantique et le système de leur langue compagnon de type, ainsi que toutes les définitions de type de compilation, et peuvent effectuer des opérations de haut niveau, y compris le contrôle de flux programmatique fondée sur l'évaluation des paramètres strictement le type-vérifiés. Les macros sont capable de commande conditionnelle sur la compilation en fonction de critères prédéterminés, mais ne peuvent pas instancier de nouveaux types, recurse, ou d'effectuer l'évaluation de type et en vigueur sont limités à pré-compilation texte de substitution et le texte-inclusion / exclusion. En d'autres termes, les macros peuvent commander l'écoulement de la compilation en fonction des symboles prédéfinis, mais ne peuvent pas, à la différence des modèles, indépendamment instancier de nouveaux symboles. Les modèles sont un outil pour statique polymorphisme (voir ci-dessous) et programmation générique.

En outre, les modèles sont un mécanisme de compilation en C ++ qui est Turing-complet, ce qui signifie que toute exprimable de calcul par un programme d'ordinateur peut être calculé, sous quelque forme, par un modèle métaprogramme avant l'exécution.

En résumé, un modèle est une fonction paramétrée moment de la compilation ou de classe écrit sans connaissance des arguments spécifiques utilisés pour instancier. Après instanciation, le code résultant est équivalent au code écrit spécifiquement pour les arguments passés. De cette manière, les modèles offrent un moyen de dissocier les aspects génériques, largement applicables de fonctions et de classes (codées dans les modèles) à certains aspects spécifiques (encodés en paramètres de modèle) sans sacrifier la performance due à l'abstraction.

Objets

C ++ introduit la programmation orientée objet (POO) dispose à C. Il offre classes, qui fournissent les quatre fonctions les plus couramment présents dans la POO (et certains non-POO) langues: abstraction, encapsulation, héritage, et polymorphisme. Une caractéristique distinctive des classes C de rapport à des classes dans d'autres langages de programmation est le soutien aux déterministe destructeurs, qui à son tour servir de support au RAII (RAII) concept.

Encapsulation

Encapsulation est la dissimulation de l'information pour se assurer que les structures de données et les opérateurs sont utilisés comme prévu et pour rendre le modèle d'utilisation plus évident pour le développeur. C ++ fournit la possibilité de définir des classes et des fonctions que ses mécanismes d'encapsulation primaires. Dans une classe, les membres peuvent être déclarés comme étant public, protected, ou privé d'appliquer explicitement encapsulation. Un membre du public de la classe est accessible à ne importe quelle fonction. Un membre privé ne est accessible qu'aux fonctions qui sont les membres de cette classe et à des fonctions et des classes autorisation d'accès explicitement accordée par la classe («amis»). Un membre protégé est accessible aux membres de classes qui héritent de la classe en plus de la classe elle-même et d'amis.

Le principe de OO est que toutes les fonctions (et seulement les fonctions) qui accèdent à la représentation interne d'un type doit être encapsulé au sein de la définition de type. C ++ prend en charge cette (via des fonctions membres et des fonctions amies), mais ne l'applique pas: le programmeur peut déclarer tout ou partie de la représentation d'un type à être public, et est autorisé à faire des entités publiques qui ne font pas partie de la représentation de le type. Par conséquent, C ++ supporte non seulement la programmation OO, mais d'autres paradigmes de décomposition plus faibles, comme programmation modulaire.

Il est généralement considéré comme bonne pratique de faire toute données privé ou protégé, et de rendre publics que les fonctions qui font partie d'une interface minimale pour les utilisateurs de la classe. Cela peut masquer les détails de la mise en œuvre de données, permettant au concepteur de changer fondamentalement plus tard la mise en œuvre sans modifier l'interface en aucune façon.

Héritage

L'héritage permet un type de données à acquérir des propriétés d'autres types de données. Héritage d'un classe de base peut être déclarée comme public, protégé ou privé. Ce spécificateur d'accès détermine si les classes non reliés et dérivées peuvent accéder aux membres publiques et protégées héritées de la classe de base. Seulement héritage public correspond à ce que l'on entend habituellement par «héritage». Les deux autres formes sont beaucoup moins fréquemment utilisés. Si le spécificateur d'accès est omis, une «classe» hérite privé, tandis qu'un "struct" hérite publiquement. Les classes de base peuvent être déclarées comme virtuelle; cela se appelle héritage virtuel. L'héritage virtuel assure qu'une seule instance d'une classe de base existe dans le graphe d'héritage, en évitant certains des problèmes d'ambiguïté de l'héritage multiple.

L'héritage multiple est une fonction C ++ ne se trouve pas dans la plupart des autres langues, permettant une classe à tirer de plus d'un cours de base; cela permet relations d'héritage plus élaborés. Par exemple, un «Flying Cat" classe peut hériter de deux "Cat" et "mammifère volant". D'autres langues, telles que C # ou Java , accomplir quelque chose de similaire (bien plus limitée) en permettant l'héritage des multiples interfaces tout en limitant le nombre de classes de base à une (interfaces, à la différence des classes, ne fournissent que des déclarations de fonctions membres, aucune donnée de mise en œuvre ou de membres). Une interface comme dans Java et C # peut être définie en C ++ en tant que catégorie qui contient des fonctions virtuelles pures uniquement, souvent appelé un classe de base abstraite ou "ABC". Les fonctions de membres de cette classe de base abstraite sont normalement définis explicitement dans la classe dérivée, pas héritées implicitement. Héritage virtuel de C présente une fonction de résolution d'ambiguïté appelé domination.

Polymorphisme

Polymorphisme permet une interface commune pour de nombreuses implémentations, et pour les objets d'agir différemment dans des circonstances différentes.

C ++ prend en charge plusieurs types de statique ( lors de la compilation) et dynamique ( run-time) polymorphismes. Compiler temps polymorphisme ne permet pas pour certaines décisions d'exécution, tandis que le polymorphisme moment de l'exécution entraîne généralement une pénalité de performance.

Polymorphisme statique

La surcharge de fonction permet aux programmes de déclarer plusieurs fonctions ayant le même nom (mais avec des arguments différents). Les fonctions se distinguent par le nombre ou le type de leur paramètres formels. Ainsi, le même nom de la fonction peut faire référence à des fonctions différentes selon le contexte dans lequel il est utilisé. Le type renvoyé par la fonction ne est pas utilisé pour distinguer les fonctions surchargées et se traduirait par un message d'erreur de compilation.

Lors de la déclaration d'une fonction, un programmeur peut spécifier un ou plusieurs paramètres a valeur par défaut. Cela permet aux paramètres par défaut avec éventuellement être omis lorsque la fonction est appelée, dans ce cas, les arguments par défaut seront utilisés. Quand une fonction est appelée avec moins d'arguments que il sont déclarés paramètres, arguments explicites sont jumelés à des paramètres afin de gauche à droite, avec tous les paramètres inégalés à la fin de la liste des paramètres étant affectés leurs arguments par défaut. Dans de nombreux cas, la spécification des arguments par défaut en une seule déclaration de fonction est préférable de fournir des définitions de fonctions surchargées avec des nombres différents de paramètres.

Modèles en C ++ fournissent un mécanisme sophistiqué pour l'écriture générique, le code polymorphe. En particulier, à travers la Curieusement motif de modèle courant, il est possible de mettre en œuvre une forme de polymorphisme statique qui imite étroitement la syntaxe pour des raisons impérieuses fonctions virtuelles. Parce que les modèles de C sont de type courant et Turing-complet, ils peuvent également être utilisés pour laisser le compilateur résoudre conditionnelles récursives et de générer d'importants programmes à travers métaprogrammation modèle. Contrairement à une opinion, le code de modèle ne sera pas générer un code en vrac après la compilation avec les paramètres appropriés de compilation.

Polymorphisme dynamique

Héritage

Pointeurs de variables (et les références) à un type de classe de base en C ++ peuvent se référer à des objets de toutes les classes dérivées de ce type en plus d'objets correspondant exactement le type de variable. Ceci permet tableaux et autres types de récipients pour contenir des pointeurs d'objets de types différents. Parce que la cession de valeurs aux variables se produit généralement au moment de l'exécution, ce est nécessairement un phénomène moment de l'exécution.

C ++ fournit également un dynamic_cast opérateur, ce qui permet au programme de tenter en toute sécurité la conversion d'un objet dans un objet d'un type d'objet plus spécifique (par opposition à la conversion d'un type plus général, qui est toujours autorisé). Cette fonctionnalité se appuie sur informations de type run-time (RTTI). Objets connus pour être d'un certain type spécifique peuvent également être émis à ce type avec static_cast , une construction purement moment de la compilation qui est plus rapide et ne nécessite pas RTTI.

Fonctions membres virtuelles

Normalement, quand une fonction dans une classe dérivée remplace une fonction dans une classe de base, la fonction à appeler est déterminée par le type de l'objet. Une fonction donnée est remplacée quand il ne existe aucune différence dans le nombre ou le type de paramètres entre deux ou plusieurs définitions de cette fonction. Ainsi, au moment de la compilation, il ne est pas possible de déterminer le type de l'objet et donc la fonction correct de l'appeler, donnée uniquement un pointeur de classe de base; la décision est donc reporté à l'exécution. Cela se appelle dispatch dynamique. Fonctions membres virtuelles ou méthodes permettent la mise en œuvre plus spécifique de la fonction à appeler, selon le type réel moment de l'exécution de l'objet. Dans les implémentations de C, cela se fait à l'aide tables de fonctions virtuelles. Si le type d'objet est connu, cela peut être contourné grâce à un caractère nom de classe entièrement qualifié avant l'appel de fonction, mais dans des appels généraux à des fonctions virtuelles sont résolues lors de l'exécution.

En plus des fonctions standards de membres, les surcharges et les destructeurs opérateur peut être virtuel. Une règle générale est que si toutes les fonctions dans la classe sont virtuels, le destructeur devrait être ainsi. Comme le type d'un objet lors de sa création est connue au moment de la compilation, les constructeurs, et par extension un constructeur de copie, ne peut pas être virtuel. Néanmoins, une situation peut survenir où une copie d'un objet doit être créé lorsque le pointeur à un objet dérivé est passé comme un pointeur sur un objet de base. Dans un tel cas, une solution commune est de créer un clone() (ou similaire) fonction virtuelle qui crée et renvoie une copie de la classe dérivée lorsqu'il est appelé.

Une fonction membre peut également être faite "virtuelle pure" en ajoutant avec = 0 après la parenthèse fermante et avant le point-virgule. Une classe contenant une fonction virtuelle pure est appelé un type de données abstrait. Les objets ne peuvent être créés à partir de types de données abstraits; ils ne peuvent être obtenus à partir. Toute classe dérivée hérite de la fonction virtuelle pure et doit fournir une définition non-pure (et toutes les autres fonctions virtuelles pures) avant objets de la classe dérivée peuvent être créés. Un programme qui tente de créer un objet d'une classe avec une fonction membre virtuelle pure ou une fonction héritée membre virtuelle pure est mal formé.

Compatibilité

Produire un compilateur C ++ raisonnablement conforme aux normes C se est avéré être une tâche difficile pour les vendeurs de compilateur en général. Pendant de nombreuses années, différents compilateurs C ++ mis en œuvre le langage C ++ pour différents niveaux de conformité à la norme, et leur mise en œuvre varient considérablement dans certains domaines tels que spécialisation de modèle partielle. Récents communiqués de presse de compilateurs C ++ plus populaires soutiennent presque tous de la norme C ++ 1998.

Pour donner une plus grande liberté compilateur fournisseurs, le comité des normes ++ C décidé de ne pas dicter la mise en œuvre de Le brouillage de noms, la gestion des exceptions, et d'autres caractéristiques spécifiques à l'implémentation. L'inconvénient de cette décision est que code objet produit par différents compilateurs devrait être incompatibles. Il y avait, cependant, tente de normaliser compilateurs pour des machines particulières ou systèmes d'exploitation (par exemple C ++ ABI), bien qu'ils semblent être largement abandonnée aujourd'hui.

Modèles exportés

Un point de discorde est notamment l' export mot-clé, destiné à permettre définitions de modèle à être séparés de leurs déclarations. Le premier compilateur largement disponibles pour mettre en œuvre export était Comeau C / C ++, au début de 2003 (cinq ans après la sortie de la norme); en 2004, le compilateur bêta de Borland C ++ Builder X a également été publié avec export . Ces deux compilateurs sont basées sur le GDE C ++ extrémité avant. Autres compilateurs tels que GCC ne supporte pas du tout. Début ANSI C ++ par Ivor Horton fournit un exemple de code avec le mot-clé qui ne compilera pas dans la plupart des compilateurs, sans référence à ce problème. Herb Sutter, ancien animateur du comité des normes C ++, a recommandé que export être retiré de futures versions du standard C ++. Lors de la réunion Mars 2010 des normes ISO C ++, le comité des normes C ++ a voté pour retirer les modèles exportés entièrement à partir de C ++ 11, mais réserver le mot-clé pour une utilisation future.

Avec C

C ++ est souvent considéré comme un sur-ensemble de C , mais ce ne est pas tout à fait vrai. La plupart du code C peut facilement être fait pour compiler correctement en C ++, mais il ya quelques différences qui font un peu de code C valide pour être invalide ou se comporter différemment en C ++.

Une différence couramment rencontré est que C permet la conversion implicite de void* à d'autres types de pointeurs, mais C ++ ne est pas. Un autre problème de la portabilité commune est que C ++ définit beaucoup de nouveaux mots-clés, comme new et class , qui peuvent être utilisés comme identifiants (par exemple les noms de variables) dans un programme C.

Certaines incompatibilités ont été éliminées par la révision de la norme C 1999 ( C99), qui prend désormais en charge les fonctionnalités de C tels que des lignes de commentaires ( // ), et les mélanges de déclarations et de code. D'autre part, C99 introduit un certain nombre de nouvelles fonctionnalités qui C ++ ne prend pas en charge, tels que tableaux de longueur variable, les types natifs nombres complexes, de désigner les initialiseurs, et littéraux composés. Cependant, au moins certains des dispositifs C99 introduites ont été incluses dans la version suivante de la norme du C, C ++ 11:

  • C99 préprocesseur (y compris macros variadic, large concaténation / étroite littérale, plus large arithmétiques entier)
  • _Pragma ()
  • long long
  • __func__
  • Têtes:
    • cstdbool ( stdbool.h )
    • cstdint ( stdint.h )
    • cinttypes ( inttypes.h ).

Pour mélanger code C et C ++, toute déclaration de définition de fonction ou qui doit être appelé à partir de / utilisé à la fois en C et C ++ doit être déclarée avec lien C en le plaçant dans un extern "C" {/*...*/} bloc . Une telle fonction peut pas compter sur les fonctionnalités en fonction de la décoration de nom (ce est à dire, la surcharge de fonction).

Critique

En raison de son grand ensemble de fonctionnalités et la syntaxe souvent perçue "strict", la langue est parfois critiquée comme étant trop complexe et donc difficile à maîtriser pleinement.

C ++ est parfois comparé défavorablement avec plus strictement orientées objet langues sur la base qu'il permet aux programmeurs de "mix and match" déclarative, fonctionnel, générique, modulaire, et procédurales styles de programmation avec la programmation orientée objet, plutôt que strictement appliquer un style unique, bien que C ++ est intentionnellement une langue multi-paradigme. Il manque également certaines fonctionnalités telles que la réflexion, bien que l'ajout de ce dernier a été envisagé.

Un article satirique largement distribué dépeint Bjarne Stroustrup, interviewé pour un numéro de 1998 de Computer magazine IEEE, confessant que C ++ a été délibérément conçu pour être complexe et difficile, le désherbage des programmeurs amateurs et augmenter les salaires des quelques programmeurs qui pourrait maîtriser la langue. La section FAQ du site Web personnel de Stroustrup contient un déni et un lien vers l'entrevue.

Richard Stallman critique C ++ pour avoir la grammaire ambiguë et "incompatibilités, triviales gratuites avec C [...] qui sont sans grand intérêt". Linus Torvalds a déclaré dans un courriel célèbre que C ++ est un «langage horribles».

Enfin, plusieurs auteurs ont remarqué que C ++ ne est pas un véritable langage orienté objet.

Le même problème se produit avec les langages de programmation. Comme indiqué précédemment, de nombreux programmeurs C déplacés dans le domaine de l'orientation de l'objet par la migration vers C ++ avant d'être directement exposés aux concepts OO. Ce serait toujours sortir dans une interview. Plusieurs fois, les développeurs qui prétendent être les programmeurs C ++ sont tout simplement les programmeurs C utilisant les compilateurs C de. [...] Nous avons déjà mentionné que C ++ est pas un vrai langage de programmation orienté objet, mais est en fait un langage de programmation orientée objet. Rappelez-vous que C ++ est considérée comme base d'objets. Concepts orientés objets ne sont pas appliquées. Vous pouvez écrire un programme non-orienté objet C en utilisant un compilateur C ++.
-Matt Weisfeld,
Il est intéressant de voir ce qui se fait dans le monde sous le nom orienté objet. On m'a montré quelques pièces à la recherche très, très étranges de code au fil des ans, par différentes personnes, y compris les personnes dans les universités, ce qu'ils ont dit est le code de la POO écrit dans un POO langue et effectivement je pris le terme orienté objet, et je peux vous dire, je ne dois C ++ à l'esprit.
- Alan Kay, Smalltalk co-créateur,
Récupéré à partir de " http://en.wikipedia.org/w/index.php?title=C%2B%2B&oldid=555926964 "