PDA

Afficher la version complète : C/C++, quelle différence ?



Emmanuel
14/06/2007, 18h58
Je programme actuellement en C++ (Qt4) et je sais qu'il y a une différence entre C et C++, mais la question que je me pose est la suivante : Quelle est la différence ? http://www.alionet.org/style_emoticons/<#EMO_DIR#>/beby.gif

li-nox
14/06/2007, 19h19
Je laisserai les spécialistes de la prog te répondre plus précisement, mais le C++ est dérivé du C, et c'est un language orienté objet...

Spyhawk
14/06/2007, 22h06
Le C++ permet de faire du code orienté-objet (perso, je vois mal me passer de ça...)

Un code en C++ est généralement plus court qu'un code en C.

Hop, premier lien sous Google : http://unthought.net/c++/c_vs_c++.html

abgech
15/06/2007, 07h20
Le C++ inclut C. À peu de choses près, c'est un sur-ensemble de C. Ce sont essentiellement des facilités liées à la programmation objet qui ont été rajoutées à C pour obtenir C++.

C++ est relativement peu efficace, tant en terme de vitesse que d'occupation mémoire, lorsqu'on utilise fortement les options programmation orientée objet, mais, c'est inhérent à ce type de programmation.

Par opposition, un programme "traditionnel" en C est toujours plus efficace, mais, dans certains types de problèmes, plus long à coder qu'en C++. La programmation système ou temps réel se fait la plupart du temps en C, pour ces raisons d'efficacité.
Contre-partie: programmer des interfaces graphiques en C, sans être compliqué, est assez fastidieux, long et peu intéressant (en fait, c'est ce type de programmation qui est, en lui-même, peu intéressant, parce que peu compliqué http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif ). Dans ce cas on a bien intérêt à utiliser un langage orienté objet.

Maintenant, mon avis personnel: C++ est une véritable usine à gaz, tout sauf orthogonal, assemblage disparate de diverses notions, c'est un peu un monstre, une chimère (au sens originel du terme). Il permet de programmer soit de façon traditionnelle (et dans ce cas on se ramène à programmer en C), soit de façon orientée objet. Dans ce dernier cas, je pense que l'on a bien intérêt à utiliser un langage objet plus simple, tel Java.

Asimov
15/06/2007, 07h41
Tout programmeur qui débute en C découvre que la gestion des types devient plus compliqué dès que l'on va au delà des types simples comme les Int et les floats. Avec ses types le compilateur fait la gestion de ses éléments sans que l'on doivent se soucier de qui se passe en mémoire. Comme par exemple, quand on réassigne un nouvelle valeur à une variable. Le compilateur récupère l'espace mémoire d'une façon automatique. Dès que l'on aborde les chaines de caractère, les choses se complique.

Avec la programmation objet, il est possible de retrouver le même confort de programmation qu'avec les types simples. Même si l'héritage n'est pas utiliser, on peut malgré tout y trouvé beaucoup d' avantages. Et les fuites de mémoires deviennent beaucoup moins une préoccupation.

Et comme la plupart des librairies contiennent presque tous les types que l'on pourrait désirer, on y gagne passablement de temps en général à développer en C++. Et une fois que l'on a piger le truc avec la notion d'héritage, on peut faire du sur-mesure à partir des librairies.

Pumpkin
16/06/2007, 21h51
Salut !

Encore des phrases d'explication http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif :
Le C est un langage dit structuré, au même titre que du fortran par exemple.
Le C++ est dit orienté-objet, comme le Java par exemple.

Globalement, à l'intérieur des classes c'est du structuré.

C'est d'ailleurs étonnant que tu connaisses le C++ sans être passé par le C !

aitina
18/06/2007, 21h37
Bonjour tout le Monde

un copier /coller du site GCN qui résume bien:



Le langage C est un langage de programmation.

Il est né avec le système Unix au début des années 70.

Le C est un langage proche de l'assembleur (il a parfois été évoqué sous le terme assembleur de haut niveau), le compilateur fait peu de vérifications et aucune d'elles n'est ajoutée à l'éxécutable. Le C est disponible sur toutes les plateformes (ou presque) et est très populaire.

Sa syntaxe a servi de modèle a beaucoup d'autres langages plus modernes (C++, Java, C#).

Sa position bas niveau nécessite une grande rigueur de la part du programmeur, notamment au niveau de la gestion de la mémoire à travers les pointeurs, souvent redoutés par les débutants.

Le langage C est très employé dans le monde des jeux vidéo, même s'il laisse souvent la place au C++. Sur les plateformes portables (GBA par exemple), il est quasi nécessaire.

Beaucoup de bibliothèques sont ou ont été programmées en C et sont accessibles facilement à partir du C, comme SDL ou Allegro.

L'approche du langage n'est pas triviale, et un parfait débutant devra s'armer de patience.

Une connaissance dans un langage de type Pascal ou un langage de script tel Python aidera l'approche du C.


Le C++ est un langage orienté objet avec une syntaxe basée sur celle du C. Il ne dépend pas d'un système en particulier, et est donc portable, en comparaison par exemple à d'autres langages comme le DarkBasic qui lui ne fonctionne que sous windows.

Le langage C++ est très employé dans le monde des jeux vidéo et de nombreuses bibliothèques de programmation sont faites pour le C++.


L'approche du langage n'est pas triviale et un parfait débutant devra s'armer de patience.

Une connaissance dans un langage de type Pascal ou un langage de script tel Python aidera l'approche du C++. Une connaissance préalable du C aide énormément mais, attention, la façon de réfléchir un programme en C et en C++ comporte un certain nombre de différences.



Cordialement

debianSarge
19/06/2007, 00h10
C++ est relativement peu efficace, tant en terme de vitesse que d'occupation mémoire, lorsqu'on utilise fortement les options programmation orientée objet, mais, c'est inhérent à ce type de programmation.[/b]

Faudrait peut être tempérer quand même, C++ est très efficace, que ce soit en terme de vitesse (sinon on ne pourrait pas faire les moteurs 3D avec) qu'en terme de mémoire (sauf si on sait pas compter ses new).
Après qu'il soit plus lent que C oui c'est sûr, mais chacun son domaine, C reste dans les couches les plus basses (matériel + réseau) tandis que C++ aborde les logiciels de plus haut niveau réclamant une grande évolutivité (d'où l'orienté objet) et impliquant de nombreuses lignes de code.

Emmanuel
07/07/2007, 11h08
C'est d'ailleurs étonnant que tu connaisses le C++ sans être passé par le C ![/b]

En fait j'ai fait Java->C++.
Quelque chose que je ne comprends pas : le C n'est pas orienté objet ? Pas de classes et tout çà ?

Pumpkin
07/07/2007, 22h21
<div class='quotetop'>Citation </div>
En fait j'ai fait Java->C++.
Quelque chose que je ne comprends pas : le C n'est pas orienté objet ? Pas de classes et tout çà ?[/b]

Tu n'as jamais fait de structuré ? = Tu n'as jamais programmé sans classe ? (exit SQL)

Sinon, non, y a pas de classe, pas de méthode mais des fonctions : Le programme s'exécute séquentiellement : les première lignes de codes du main() sont exécutées, puis les suivantes, jusqu'a la fin du main().

Sinon le meilleur moyen de te rendre compte de cette découverte : te rendre dans une librairie spécialisée et ouvrir un bon gros pavé intitulé : Langage C

abgech
08/07/2007, 07h57
...Quelque chose que je ne comprends pas : le C n'est pas orienté objet ? Pas de classes et tout çà ?[/b]

Tu sais, il existe bien d'autres paradigmes de programmation que l'orienté objet: programmation structurée, programmation en logique, programmation fonctionnelle, etc.

En programmation orientée objet, un certain nombre de choses ne sont pas mises en place lors de la compilation, mais, comme pour un interpréteur, lors de l'exécution. C'est un énorme avantage lors de la programmation puisque cela autorise une assez grande expressivité sémantique, sans compliquer outre mesure la programmation.
En corollaire, une efficacité réduite, tant en termes de place mémoire qu'en temps d'exécution. Cela ne porte absolument pas à conséquence sur des applications finales dans lesquelles le code ne s'exécute qu'un nombre limité de fois par seconde. Typiquement une interface graphique, une consultation de données, un calcul scientifique (pour autant qu'il ne fasse pas appel aux aspects dynamiques de la programmation orientée objet), etc.
Par contre, pour des tâches de type système, qui s'exécutent souvent 100, 200, 300 fois par seconde (je pense par exemple au scheduler), la programmation orientée objet est innaplicable. D'autant plus que la programmation objet utilise intensivement l'allocation dynamique de mémoire. Dans un système d'exploitation, si la couche que tu programmes est située en dessous de la couche de gestion mémoire, tu ne dispose pas de l'allocation dynamique de mémoire (si tu en as besoin, tu te la fais toi-même) alors, dans ce cas, orienté objet: tintin ! L'idéal, dans ce type de problèmes, serait l'assembler, malheureusement, absolument pas portable, alors le C (aussi appelé "assembler portable") est un assez bon choix. En fait, maintenant, dans ce domaine, tout se fait en C, sauf cas très particuliers d'emploi de l'assembler, en d'informatique embarquée, lorsque la vitesse d'exécution est prépondérante, la place mémoire réduite et le lien avec le matériel tellement étroit que la portabilité n'a pratiquement plus de sens, par exemple en acquisition de données et traitement du signal, certains pilotes de périphériques.

Il faut utiliser le langage adapté au problème que l'on veut résoudre. Amha, il serait totalement absurde de programmer un interface comptable en C, tout comme programmer un gestionnaire de mémoire en Java.

J'enseigne la programmation (pour dire les choses simplement) dans une école d'ingénieur. Lors des travaux que je propose, le choix du langage de programmation appartient toujours au candidat. mais je spécifie que ce choix fera partie de l'évaluation du travail, tant il est vrai que choisir le bon outil, bien adapté au problème, fait partie du travail d'un ingénieur (et le candidat qui dit: j'ai choisi le langage xyz parce que c'est celui que je connais le mieux est plutôt mal parti http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif ).

PS
Tu nous dis que tu as commencé par programmer en Java pour ensuite passer à C++. Je pense que, pour la programmation orientée objet, Java est un bien meilleur choix que C++. À mon avis, C++ est un infâme bricolage visant à réunir deux mondes (programmation structurée et programmation objet) qui n'ont que peu de rapport ensemble. Alors, un conseil: continue avec Java et apprends la programmation structurée avec le C. Un excellent bouquin à ce propos: "Le langage C" par B.W. Kernighan et D.M. Ritchie (créateur du langage C). Lors des premiers exercices tu te demande si les auteurs ne te prennent pas pour oligocéphale, mais très rapidement tu t'aperçois qu'ils te prennent pour plus futé que tu n'es ! http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

Emmanuel
29/07/2007, 12h28
Bah finalement j'ai acheté un livre sur le C++ pour m'approfondir, et les différences sont expliquées dedans.
Merci à tous pour vos réponses !!

debianSarge
29/07/2007, 14h54
En programmation orientée objet, un certain nombre de choses ne sont pas mises en place lors de la compilation, mais, comme pour un interpréteur, lors de l'exécution. C'est un énorme avantage lors de la programmation puisque cela autorise une assez grande expressivité sémantique, sans compliquer outre mesure la programmation.
....[/b]

Ce n'est pas vrai C++ met tout en place à la compilation seules certaines conversions dynamiques se font à l'exécution mais on est très loin du typage dynamique de Ruby par exemple (qui au passage peut se prévaloir du titre de langage Full-Object au contraire de Java).

<div class='quotetop'>Citation (abgech @ 8/07/2007 à 7:57) <{POST_SNAPBACK}> (index.php?act=findpost&pid=144381)</div>
En fait, maintenant, dans ce domaine, tout se fait en C, sauf cas très particuliers d'emploi de l'assembler, en d'informatique embarquée, lorsque la vitesse d'exécution est prépondérante, la place mémoire réduite et le lien avec le matériel tellement étroit que la portabilité n'a pratiquement plus de sens, par exemple en acquisition de données et traitement du signal, certains pilotes de périphériques.[/b]

En embarqué on ne bosse quasiment plus avec l'assembleur mais avec du C. En effet même l'assembleur d'un simple microcontôleur est compliqué de nos jours, à part ceux des Intel 8051 et dérivés, mais sinon il est difficile de produire un meilleur code assembleur que celui du compilateur spécifique aux architectures utilisées en embarqué.

<div class='quotetop'>Citation (abgech @ 8/07/2007 à 7:57) <{POST_SNAPBACK}> (index.php?act=findpost&pid=144381)</div>
PS
Tu nous dis que tu as commencé par programmer en Java pour ensuite passer à C++. Je pense que, pour la programmation orientée objet, Java est un bien meilleur choix que C++. À mon avis, C++ est un infâme bricolage visant à réunir deux mondes (programmation structurée et programmation objet) qui n'ont que peu de rapport ensemble.[/b]

C'est vrai qu'à la base C++ n'était lui non plus pas destiné à la programmation orienté objet, mais les mécanismes qu'il propose sont tout de même relativement intéressant et permette d'implémenter toutes les situations d'une modélisation objet. A mon avis le problème de Java ets de vouloir trop simplifier la tâche aux programmeurs en proposant des mécanismes spécifiques aux langages (comme les interfaces ou les JavaBeans par exemple). De plus comme je l'ai dit plus haut ce langage essaye de se donner une image de complètement orienté objet, dans le but d'affirmer une place de leader dans le domaine objet, mais jusqu'à preuve du contraire en Java : les types de base ne sont pas des objets, les tableaux ne sont pas des objets, ...... (encore une fois contrairement à Ruby http://www.alionet.org/style_emoticons/<#EMO_DIR#>/smile.gif.
Alors je ne veux pas lancer le troll JavaC'estMal et tout ce qui va avec mais pour moi c'est loin d'être la référence.

Bonne continuation
@+

Emmanuel
11/08/2007, 11h38
Ça y est, j'ai chopé la migraine... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/beby.gif
Perso je passe en terminale GEL, alors savoir que je vais faire du C sur les micro-controleurs, ça m'enchante à vrai dire ! (Surtout que j'aurais de l'avance sur ce domaine).

debianSarge
11/08/2007, 12h59
J'ai un pote qui avait fait terminale Génie Electro (j'imagine que c'est ça GEL) et il me semble qu'il avait bossé sur des µC très simple type 8051 je pense et il me semble qu'ils l'avaient vu avec l'assembleur, ça permet de bien comprendre la notion de registre dans un processeur et de coûts d'opérations en temps d'horloge.

Bon courage en tout cas tu devras bien t'éclater sur ces petites bêtes !!!

Emmanuel
23/09/2007, 09h26
Effectivement, on attaque cette partie prochainement !

ahlner
24/09/2007, 08h05
Effectivement, on attaque cette partie prochainement ![/b]


Bonjour,

J'ai programmé un peu en assembleur, notamment 68K et X86, en Pascal, en C.
Mais jamais en objet.
J'ai lu que la prog objet fait appel aux notions suivants :
-héritage
-réutilisabilé
-modularité

Qui connait Smaltalk, un langage à objet?
Existe t-il un compilateur ou un interpréteur gratuit de ce langage?
D'après l'auteur d'un article, c'est du pur objet.
Bien que je n'ai pas envie de programmer en ce moment, j'aimerais comprendre ce qu'est la programmation objet et la programmation logique (Prolog).
Le Lisp est-il de la programmation fonctionnelle?
Merci d'avance et bonne journée,

alhner