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 "