Les principales diffrences entre C++ et Java
Hlne Toussaint, mai 2012
Ce document a pour but de synthtiser les diffrences "les plus" ( mon sens...) importantes entre
C++ et Java. Il n'est donc pas exhaustif et ne rfrence pas les diffrences dans les bibliothques
auxiliaires (STL / collections ...). Il s'adresse des dveloppeurs C++ ou Java dj l'aise avec les
concepts de la POO (Programmation Orient Objet).
Pour une tude approfondie du langage Java (resp. C++) je conseille Programmer en Java (resp.
Programmer en langage C++ ) de Claude Delannoy aux Editions Eyrolles.
Thme C++ Java
Compilation et La compilation (qui passe par plusieurs La compilation d'un code source produit
portabilit tapes : prprocessing, cration des un code intermdiaire (et non un code
fichiers objet, ditions des liens) fournit binaire) qui a besoin de la JVM (Java
un fichier binaire (ou excutable) Virtual Machine) pour tre interprt. Ce
directement utilisable sur la machine sur code est portable sur toute machine
laquelle il a t cr. Pour l'utiliser sur disposant de la JVM (attention quand
une autre machine il faut bien souvent mme aux diffrences entre les versions
recompil le source... de la JVM).
Conception Permet la programmation orient objet Java est presque pure POO :
(POO) et la prog. procdurale : les classes sont obligatoires MAIS
aucune obligation de crer des classes - il existe des types primitifs (int, double,
boolean, ...)
- on peut crer des mthodes de classes
statiques (static) qui sont utilisables sans
instancier d'objet
Variable Variables dclares avec le mot-cl const Variables dclares avec le mot-cl
Constantes final
Mthodes Le mot-cl const est plac aprs la N'existe pas. (final appliqu une
constantes dclaration de la mthode. Seules les mthode a un sens compltement
mthodes constantes peuvent agir sur diffrent -> voir plus bas)
une objet constant
Conversion de Toutes les conversions numriques de Seules les conversions qui relvent de
type type par affectation sont acceptes quitte promotion numrique sont autorises par
dgrader fortement l'information affectation (les autres doivent tre
demandes explicitement)
Dfinition / Gnralement la dclaration d'une classe Les dclarations et dfinitions sont dans le
dclaration de est dans un fichier ".h" distinct du fichier mme fichier ".java"
classes d'implmentation (ou dfinition) ".cpp"
Pointeur Un pointeur reprsente l'adresse de Il n'existe pas de pointeur en Java
l'objet point, on le manipule comme une
variable
Instanciation Deux solutions : Une seule solution :
d'un objet - par sa dclaration -> objet automatique - par new et on dispose alors d'une
- par new -> objet dynamique (pointeur) rfrence sur l'objet (et non d'un pointeur
comme en C++)
Instanciation - parenthses non obligatoires : parenthses obligatoires, seule dclaration
constructeur A a; possible :
par dfaut A * a = new A; A * a = new A();
A * a = new A();
Gestion - Toutes les variables alloues par new - Java dispose d'un ramasse miettes : le
mmoire doivent tre explicitement dtruites par ramasse miettes dtecte les objets qui ne
delete sont plus rfrencs et les dtruit ->
- La dclaration d'un objet entrane la delete n'existe pas en Java
rservation d'un emplacement mmoire - la dclaration d'un objet entrane la
pour l'objet rservation d'un emplacement mmoire
pour une rfrence l'objet (et non pour
l'objet) la mmoire ddie l'objet sera
effectivement alloue avec new
Passage 3 possibilits : 1 seule possibilit : par valeur MAIS
d'arguments - par valeur (les modifications restent - pour les types primitifs les modifications
locales la fonction) sont donc locales la fonction,
- par adresse ou pointeur (les - pour les objets (le nom de l'objet tant
modifications sont effectives hors de la une rfrence) les modifications sont
fonction) effectives hors de la fonction
- par rfrence (les modifications sont
effectives hors de la fonction)
Init. par dfaut Non Oui ( 0, false ou NULL)
des champs
d'un objet
Affectation Pour les objets automatiques copie Copie de la rfrence uniquement
d'objet superficielle (recopie des valeurs des
a = b diffrents champs)
Valeurs Oui : la dclaration d'une fonction peut N'existe pas
d'argument par contenir des arguments par dfaut :
dfaut void f ( int n = 0);
Allocation de 2 possibilits : Toujours dynamique -> avec new :
tableaux - tableaux statiques : int t [] = new int [10];
int t [10]; ou
- tableaux dynamiques : int [] t = new int [10];
int * t = new int [10];
Taille d'un Il n'existe pas de champ propre un Les tableaux se manipulent comme des
tableau tableau, on doit stocker la taille dans une objets. Il existe un champ par dfaut
autre variable "length" auquel on accde par t.length
(o t est le nom du tableau)
Tableaux en En C++ les tableaux plusieurs indices En Java les tableaux plusieurs indices
mmoire dclars de manire statique sont fractionnent la mmoire :
contigus en mmoire int t [][] = new int [10][25]
Ex : int t [10][25] cre 250 cases non contigus
contiges
Hritage : Trois possibilits : Une seule possibilit :
drivation class B : public A class B extends A qui correspond
class B : private A la drivation publique de C++
class B : protected A
Hritage Oui Non (mais il existe la notion d'interface)
multiple
Constructeur - Doit prendre en charge la partie - Doit prendre en charge l'intgralit de la
d'une classe spcifique de la classe fille : le construction de l'objets
fille constructeur de la classe mre est - Peut appeler le constructeur de la classe
automatiquement appel par C++ mre via le mot-cl super(), dans ce cas ce
- si le constructeur de la classe mre doit tre la premire instruction
ncessite des arguments on peut les B( int arg1, double arg2){
prciser dans l'entte via ":" super(arg1);
B::B( int arg1, double arg2) : //...
A (arg1) }
Drivations oui oui (dans ce cas super dsigne le
successives constructeur la classe directement
suprieure)
Membres Accessibles seulement aux classes Accessibles aux classes drives et aussi
protected drives aux classes du mme paquetage
Redfinition de Appel la mthode de la classe mre via Appel la mthode de la classe mre via le
mthode l'oprateur de rsolution de porte "::" mot cl super
void B::affiche (){
A::affiche();
//...
}
Polymorphisme Mis en uvre uniquement si : Toujours effectif (la ligature est toujours
- ligature dynamique (utilisation de dynamique)
pointeurs sur les objets)
- mthodes virtuelles (utilisation du mot
cl virtual)
Classes Une classe est abstraite (ne peut tre Mot-cl abstract :
abstraites instancie) si elle contient une mthode - soit plac devant la classe
virtuelle pure - soit appliqu une mthode (ce qui rend
immdiatement la classe abstraite)
Arguments de int main (int argc, char * argv[]) public static void main (String[]
args)
la ligne de
argc donne le nombre d'lment (nom
commande
du programme compris) et argv contient On accde aux nb d'lments par
les arguments args.length, le nom du pgr n'est pas
considr comme un argument
Gestion des Trs simple grce aux oprateurs << et Beaucoup plus complexe : plusieurs
flux >> classes, pas de fonctionnalit de lecture
formate
Quelques fonctionnalits qui n'existent pas en C++
Super-classe Toutes les classes drivent implicitement de cette super classe -> elles en
Object possdent toutes les fonctionnalits (par ex. toString() fournit le nom de la classe
et son @)
Classes et - Une mthode final ne peut pas tre redfinie dans une classe fille
mthodes final - Une classe final ne peut plus tre drive
Interface Une interface ne dfinit que des en-tte de mthodes et des constantes
Une classe peut implmenter une ou plusieurs interfaces