-
Similitudes et différences entre C++ et Java
1. Pointeur ★★★★★
Les pointeurs en C C++ offrent une grande flexibilité, mais la flexibilité comporte également des dangers. Un fonctionnement incorrect des pointeurs peut facilement provoquer des problèmes tels que des fuites de mémoire ou des pointeurs suspendus.
Java annule les pointeurs. Mais en fait, le nom de tous les types de données de référence déclarés en Java peut être compris comme un pointeur. Le nom est stocké dans la mémoire de la pile et pointe vers l'espace ouvert par new dans la mémoire.
comme:
tableau int[] = nouveau int[10]
Le tableau de noms de tableau d'entiers se trouve sur la mémoire de la pile, et un espace de 10*4 octets est ouvert sur la mémoire du tas, et le tableau pointe vers le bloc de mémoire.
Le tableau peut être compris comme un pointeur, et l'adresse qui y est stockée est l'espace créé par new.
comme:
personne de classe{
…
}
Personne p = nouvelle Personne();
Le nom de l'objet p est ouvert dans la mémoire de la pile et new est utilisé pour ouvrir de l'espace dans la mémoire du tas pour l'objet. Le nom de l'objet p pointe vers la mémoire du tas.
Mais en fait, le nom n’est pas comme un pointeur en C++, surtout lors du passage de paramètres.
Java a déclaré que le passage des paramètres se fait uniquement par valeur.
Mais lorsque le type de données de référence est utilisé comme paramètre de fonction, lorsqu'un objet déclaré p1 est transmis, une copie de l'objet p2 est en fait générée. Ce p2 pointe vers p1, donc lors de l'appel des membres de p1 à p2, il peut. être terminé, attendez que l'appel de fonction soit terminé et conservez la modification. comme:
personne de classe{
nom de chaîne publique ;
âge public int ;
Personne publique (nom de chaîne, âge int) {
this.name = nom ;
this.age = âge;
}
}
Test de classe publique{
public static void main (String[] args){
Personne p = nouvelle Personne("Zhang San", 10);
System.out.println("Avant modification-->Nom : "+ p.name+", Age : "+p.age);
changePro(p); //L'objet p est transmis et une copie de p est générée. Supposons qu'il s'agisse de p1, qui pointe vers p. //Grâce à cette copie p1, les membres de p peuvent être appelés.
System.out.println("Après modification-->Nom : "+ p.name+", Age : "+p.age);
}
public static void changePro(Person p){ //Les membres de l'objet d'origine peuvent être appelés via la copie
p.name = "李思";
page = 30 ;
}
}
résultat:
Avant modification -> Nom : Zhang San, âge : 10
Après modification -->Nom : Li Si, âge : 30
Mais lorsque vous transmettez p1, une copie de p2 est générée, puis essayer de changer le pointage de p1 à p2 est évidemment impossible. À ce stade, seul le pointage de p2 est modifié. Une fois l'appel de fonction terminé, le pointage. de p1 reste inchangé. comme:
personne de classe{
nom de chaîne publique ;
âge public int ;
Personne publique (nom de chaîne, âge int) {
this.name = nom ;
this.age = âge;
}
}
Test de classe publique{
public static void main (String[] args){
Personne p = nouvelle Personne("Zhang San", 10);
System.out.println("Avant modification-->Nom : "+ p.name+", Age : "+p.age);
changeObj(p); //L'objet p est transmis, qui est une copie de p. Supposons qu'il s'agisse de p1, qui pointe vers p. //Dans la fonction, seul le pointeur de cette copie est modifié.
System.out.println("Après modification-->Nom : "+ p.name+", Age : "+p.age);
}
public static Person newP = new Person("李思", 30);
public static void changeObj(Personne p){
p = newP; //Tentative de changer le pointeur, mais ce qui change en réalité, c'est le pointeur de la copie.
//Une fois la fonction terminée, le pointage de l'objet d'origine ne changera pas
}
}
résultat:
Avant modification -> Nom : Zhang San, âge : 10
Après modification -> Nom : Zhang San, âge : 10
2. Allocation dynamique de mémoire
En C++, new et delete sont utilisés pour allouer et recycler dynamiquement la mémoire. New consiste à ouvrir de l'espace sur la mémoire tas. Une fois la mémoire utilisée, delete doit être utilisée manuellement pour la recycler.
Tant qu'un type de données de référence est déclaré en Java, new doit être utilisé pour ouvrir l'espace mémoire avant utilisation. Mais après la mort de l'objet, il n'est pas nécessaire de récupérer manuellement la mémoire. Le propre mécanisme de recyclage de mémoire de Java recyclera automatiquement les objets poubelles (les objets dits poubelles font référence à la mémoire d'objets précédemment ouverte, qui n'est plus référencée par la mémoire de la pile). Bien entendu, le recyclage manuel peut également être effectué via la méthode System.gc().
3. Destructeur
La fonction du destructeur C++ (pas de paramètres, pas de valeur de retour) est de libérer l'espace mémoire alloué dynamiquement dans le constructeur, c'est-à-dire d'appeler (cet appel peut être appelé via le destructeur objet, ou le système peut automatiquement attendre que la durée de vie de l'objet se termine.
Il n'y a pas de destructeur en Java et les objets inutiles sont automatiquement recyclés via le mécanisme de récupération de place. Cependant, vous pouvez obtenir le même effet que le destructeur en C++ en remplaçant la méthode fanalize() dans la classe Object. Lorsque l'objet est détruit manuellement ou automatiquement, la méthode fanalize() sera automatiquement appelée.
4. Contenu dans les classes vides
La classe vide de C++ doit avoir 4 fonctions : constructeur par défaut, destructeur par défaut et constructeur de copie par défaut.
Les classes vides de Java incluent : le constructeur par défaut, les méthodes héritées de la classe Object, telles que
Attributs par défaut dans les classes Il existe trois types d'autorisations d'accès aux membres dans les classes C++ : public>protected>private. Si elle n'est pas déclarée, l'autorisation par défaut est privée.
Il existe quatre types d'autorisations d'accès aux membres dans les classes Java : public>protected>defalt>private. La valeur par défaut est l'autorisation par défaut.
5. Implémentation des fonctions membres dans les classes
C’est habituel en C++. h La fonction est déclarée dans la classe du fichier d'en-tête en dehors de la classe. Pour implémenter la fonction dans le fichier cpp, #include le fichier d'en-tête.
comme:
//démo.h
Personne de classe{
Publique:
Void fun(); //Déclaré en classe
}
//démo.cpp
#include « démo.h »
Void Person::fun(){ //Implémentation en dehors de la classe
. . . . //organisme de mise en œuvre
}
Java est une méthode de déclaration + implémentation dans une classe. S'il n'est pas implémenté dans une classe, l'ajout du mot-clé abstract est une méthode abstraite.
comme:
personne de classe{
Public void fun(){//Déclaration + implémentation en classe
. . . . //organisme de mise en œuvre
}
}
6. Instanciation d'objets
personne de classe{
privé:
âge entier ;
publique:
Personne(){}
Personne(int a){
âge = un ;
}
vider le plaisir(){….}
}
. . . . //Début de la fonction principale
Person p1; //Le constructeur sans paramètres est appelé
Person p2(18); //Appelle le constructeur paramétré
p1.fun(); //Appeler la fonction membre
p2.fun();
Pour instancier un objet en Java, vous devez utiliser le nouveau mot-clé.
personne de classe{
nom de chaîne privé ;
âge int privé ;
Personne publique(){}
Personne publique (nom de chaîne, âge int) {
this.name = nom ;
this.age = âge;
}
public void fun() {…..}
}
. . . . . //Début de la fonction principale
Personne p1 = null ;
p1 = new Person(); //Vous devez utiliser le mot-clé new pour ouvrir de l'espace mémoire et appeler le constructeur sans paramètre.
Person p2 = new Person("Zhang San", 18); //Appelle le constructeur paramétré.
p1.fun(); //Appeler la méthode
p2.fun();
7. Ce mot-clé
C'est ce qu'on appelle ce pointeur en C++ Lorsqu'un objet est instancié, un pointeur this sera généré par défaut pour pointer vers cet objet. Il est utilisé par le compilateur pour distinguer les différents objets de la même classe. C'est-à-dire en tant qu'objet. Lorsque vous utilisez une fonction membre, vous savez de quel objet il s'agit grâce au pointeur this et appelez la fonction membre pour exploiter les propriétés membres de l'objet.
Cela a trois utilisations en Java :
1. Représente les attributs ou méthodes de cette classe. Comme ça. Méthode, ça. propriété.
2. Représente l'objet actuel.
3. Appelez la méthode constructeur de cette classe. Comme this(), this(paramètre 1, paramètre 2...).
[Les fonctions des utilisations 1 et 2 sont similaires au pointeur this en C++. 】
8. Appel de membres d'objet
C++ transmet des objets. Fonction membre ou pointeur de classe -> fonction membre à appeler.
En Java, vous ne pouvez transmettre que des objets. Appel de fonction membre.
Les membres de l'attribut Static des deux peuvent être directement transmis via le nom de la classe. Les fonctions membres sont appelées directement.
9. Sous-classe-->Classe parent, les paramètres passés par le constructeur ont quelque chose en commun : si le constructeur de la sous-classe n'indique pas clairement quel constructeur de la classe parent appeler, le système appelle par défaut le constructeur sans paramètre du parent. classe. Dans le même temps, si la classe parent définit un constructeur avec des paramètres, il est préférable de définir un constructeur sans paramètres.
personne de classe{
privé:
âge entier ;
publique:
Personne(){}
Personne(int a){
âge = un ;
}
}
Étudiant de la classe : Personne publique{
privé:
score entier ;
publique:
Student(int a, int s):Person(a){ //Passer au constructeur de la classe parent
note = s ;
}
}
personne de classe{
nom de chaîne privé ;
âge int privé ;
Personne publique(){}
Personne publique (nom de chaîne, âge int) {
this.name = nom ;
this.age = âge;
}
}
L'élève de la classe étend la personne {
score int privé ;
public Student (Nom de la chaîne, âge int, score int) {
super(name,age); //passe au constructeur de la classe parent
this.score = score ;
}
}
10. Polymorphisme
Le polymorphisme en C++ doit être obtenu par [fonction virtuelle ou fonction virtuelle pure + couverture de sous-classe de fonction virtuelle ou fonction virtuelle pure].
Les fonctions virtuelles sont déclarées avec virtual,
comme:
virtual void fun(); //Déclaration dans la classe
nom de classe void : fun() {….}//implémentation en dehors de la classe
Java utilise des sous-classes pour remplacer les méthodes ordinaires dans les classes parents ordinaires, des sous-classes pour remplacer les méthodes ordinaires ou les méthodes abstraites dans les classes abstraites et des sous-classes pour remplacer les méthodes abstraites dans les interfaces. +Transformer vers le haut.
Les méthodes abstraites sont déclarées avec abstract et n'ont aucune implémentation de contenu.
comme:
abstract void fun(); //Aucune implémentation dans la classe
11. Classes abstraites Aucune des classes abstraites ne peut instancier des objets. Les fonctions virtuelles pures et les méthodes abstraites ont des concepts et des fonctions similaires.
On peut aussi dire qu'il existe des classes abstraites en C++, des classes avec des fonctions virtuelles pures.
Une fonction virtuelle pure est une fonction virtuelle sans implémentation de contenu et avec "=0", et ne peut pas instancier d'objets.
comme:
virtual void fun() = 0; //Déclaré comme =0 dans la classe, il n'est pas implémenté en dehors de la classe.
Une classe abstraite en Java est une classe déclarée avec le mot-clé abstract et contient des méthodes abstraites. L'objet ne peut pas être instancié.
Une interface en Java est une classe spéciale ou une classe abstraite spéciale. Il est composé de toutes les constantes statiques et fonctions abstraites.
12. Droits d'accès
C++ utilise trois méthodes d'héritage pour modifier les droits d'accès des membres entre les sous-classes et les classes parentes.
Étudiant de la classe : Personne publique{
publique:
. . . . . .
Privé:
. . . . . .
} ;
ouvrier de classe : personne protégée{
publique:
. . . . . .
Privé:
. . . . . .
} ;
Agriculteur de classe : personne privée{
publique:
. . . . . .
Privé:
. . . . . .
} ;
Java implémente les autorisations d'accès aux membres entre différentes classes via le mécanisme de package.
Paquet org.tyut.a
personne de classe{
privé…..
privé……
publique…….
publique…
}
paquet org.tuyt.b
personne de classe{
privé…..
privé……
publique…….
publique…
}
paquet org.tuyt.c
personne de classe{
privé…..
privé……
publique…….
publique…
}
13. L'idée du package de prétraitement C++ et d'importation Java est la même : lorsque vous souhaitez utiliser une classe autre que la classe actuelle,
En C++, utilisez la directive de précompilation #include avant la définition de la classe pour inclure la bibliothèque de classes à inclure.
Les bibliothèques de classes standard utilisent des crochets < > sans h. Utilisez des guillemets doubles "" avec h dans la bibliothèque de classes personnalisées, et la recherche sera effectuée en premier à partir du chemin actuel.
comme:
#include <iostream>
#include « démo.h »
En Java, pour importer la classe que vous souhaitez utiliser, utilisez la commande import et indiquez le package dans lequel se trouve la classe.
comme:
importer Java. Lang. *;
importer l'organisation Tyut. *;