-
Ähnlichkeiten und Unterschiede zwischen C++ und Java
1. Zeiger ★★★★★
Zeiger in C C++ bieten große Flexibilität, aber Flexibilität birgt auch Gefahren. Eine unsachgemäße Bedienung von Zeigern kann leicht zu Problemen wie Speicherverlusten oder baumelnden Zeigern führen.
Java löscht Zeiger. Tatsächlich kann der Name aller in Java deklarierten Referenzdatentypen jedoch als Zeiger verstanden werden. Der Name wird im Stapelspeicher gespeichert und verweist auf den von new im Speicher geöffneten Speicherplatz.
wie:
int[] array = new int[10]
Der ganzzahlige Array-Name-Array befindet sich im Stapelspeicher, und im Heap-Speicher wird ein 10 * 4-Byte-Speicherplatz geöffnet, und das Array zeigt auf den Speicherblock.
Das Array kann als Zeiger verstanden werden, und die darin gespeicherte Adresse ist der von new erstellte Speicherplatz.
wie:
Klasse Person{
…
}
Person p = neue Person();
Der Objektname p wird im Stapelspeicher geöffnet und new wird verwendet, um Platz im Heapspeicher für das Objekt freizugeben. Der Objektname p zeigt auf den Heapspeicher.
Tatsächlich ist der Name jedoch kein Zeiger in C++, insbesondere bei der Übergabe von Parametern.
Java hat angegeben, dass die Parameterübergabe ausschließlich nach Wert erfolgt.
Wenn jedoch der Referenzdatentyp als Funktionsparameter verwendet wird und ein deklariertes Objekt p1 übergeben wird, wird tatsächlich eine Kopie des Objekts p2 generiert. Dieses p2 zeigt auf p1, sodass dies beim Aufrufen der Mitglieder von p1 bis p2 möglich ist Wenn die Änderung abgeschlossen ist, warten Sie, bis der Funktionsaufruf abgeschlossen ist, und behalten Sie die Änderung bei. wie:
Klasse Person{
öffentlicher String-Name;
öffentliches Int-Alter;
öffentliche Person(String name,int age){
this.name = Name;
this.age = Alter;
}
}
öffentlicher Klassentest{
public static void main(String[] args){
Person p = neue Person("Zhang San", 10);
System.out.println("Vor der Änderung ->Name: "+ p.name+", Alter: "+p.age);
changePro(p); //Objekt p wird übergeben und eine Kopie von p wird generiert, die auf p zeigt. //Über diese Kopie p1 können Mitglieder von p aufgerufen werden.
System.out.println("Nach der Änderung-->Name: "+ p.name+", Alter: "+p.age);
}
public static void changePro(Person p){ //Mitglieder des Originalobjekts können über die Kopie aufgerufen werden
p.name = "李思";
S.Alter = 30;
}
}
Ergebnis:
Vor der Änderung -> Name: Zhang San, Alter: 10
Nach der Änderung -> Name: Li Si, Alter: 30
Wenn Sie jedoch p1 übergeben, wird eine Kopie von p2 generiert, und der Versuch, die Ausrichtung von p1 auf p2 zu ändern, ist zu diesem Zeitpunkt offensichtlich nicht möglich. Nach Abschluss des Funktionsaufrufs wird die Ausrichtung geändert von p1 bleibt unverändert. wie:
Klasse Person{
öffentlicher String-Name;
öffentliches Int-Alter;
öffentliche Person(String name,int age){
this.name = Name;
this.age = Alter;
}
}
öffentlicher Klassentest{
public static void main(String[] args){
Person p = neue Person("Zhang San", 10);
System.out.println("Vor der Änderung ->Name: "+ p.name+", Alter: "+p.age);
changeObj(p); //Das Objekt p wird übergeben, das eine Kopie von p ist. Angenommen, es ist p1, das auf p zeigt. //In der Funktion wird nur der Zeiger dieser Kopie geändert.
System.out.println("Nach der Änderung-->Name: "+ p.name+", Alter: "+p.age);
}
public static Person newP = new Person("李思", 30);
public static void changeObj(Person p){
p = newP; //Versuch, den Zeiger zu ändern, aber was sich tatsächlich ändert, ist der Zeiger der Kopie.
// Nach Beendigung der Funktion ändert sich die Ausrichtung des ursprünglichen Objekts nicht
}
}
Ergebnis:
Vor der Änderung -> Name: Zhang San, Alter: 10
Nach der Änderung -> Name: Zhang San, Alter: 10
2. Dynamische Speicherzuweisung
In C++ werden „new“ und „delete“ verwendet, um Speicher dynamisch zuzuweisen und wiederzuverwenden. „New“ dient dazu, Speicherplatz im Heap-Speicher freizugeben. Nachdem der Speicher verwendet wurde, muss „delete“ manuell verwendet werden, um ihn wiederzuverwenden.
Solange in Java ein Referenzdatentyp deklariert ist, muss vor der Verwendung new verwendet werden, um den Speicherplatz freizugeben. Aber nachdem das Objekt gestorben ist, besteht keine Notwendigkeit, den Speicher manuell zurückzugewinnen. Javas eigener Speicherrecyclingmechanismus recycelt Müllobjekte automatisch (die sogenannten Müllobjekte beziehen sich auf den zuvor geöffneten Objektspeicher, auf den der Stapelspeicher nicht mehr verweist). Natürlich kann das manuelle Recycling auch über die Methode System.gc() durchgeführt werden.
3. Destruktor
Die Funktion des C ++ - Destruktors (keine Parameter, kein Rückgabewert) besteht darin, den dynamisch zugewiesenen Speicherplatz im Konstruktor freizugeben, dh aufzurufen (dieser Aufruf kann über das Objekt aufgerufen werden. Destruktor, oder das System kann automatisch warten bis Die Lebensdauer des Objekts endet. Rufen Sie den Destruktor auf.
In Java gibt es keinen Destruktor, und Müllobjekte werden automatisch über den Müllsammelmechanismus recycelt. Sie können jedoch den gleichen Effekt wie der Destruktor in C++ erzielen, indem Sie die fanalize()-Methode in der Object-Klasse überschreiben. Wenn das Objekt manuell oder automatisch zerstört wird, wird die fanalize()-Methode automatisch aufgerufen.
4. Inhalte in leeren Klassen
Die leere Klasse von C++ muss über 4 Funktionen verfügen: Standardkonstruktor, Standarddestruktor und Standardkopierkonstruktor.
Zu den leeren Klassen von Java gehören: Standardkonstruktor, von der Object-Klasse geerbte Methoden, wie z
Standardattribute in Klassen Es gibt drei Arten von Mitgliedszugriffsberechtigungen in C++-Klassen: öffentlich > geschützt > privat. Wenn nicht deklariert, ist die Standardberechtigung privat.
In Java-Klassen gibt es vier Arten von Zugriffsberechtigungen für Mitglieder: public>protected>defalt>private. Der Standardwert ist die Standardberechtigung.
5. Implementierung von Memberfunktionen in Klassen
Es ist in C++ üblich. h Die Funktion wird in der Klasse der Header-Datei außerhalb der Klasse deklariert. Um die Funktion in der CPP-Datei zu implementieren, fügen Sie die Header-Datei #ein.
wie:
//demo.h
Klassenperson{
Öffentlich:
Void fun(); //In der Klasse deklariert
}
//demo.cpp
#include „demo.h“
Void Person::fun(){ //Implementierung außerhalb der Klasse
. . . . //Implementierungskörper
}
Java ist eine Deklarations- und Implementierungsmethode in einer Klasse. Wenn es nicht in einer Klasse implementiert ist, ist das Hinzufügen des Schlüsselworts abstract eine abstrakte Methode.
wie:
Klasse Person{
Public void fun(){//Deklaration + Implementierung in der Klasse
. . . . //Implementierungskörper
}
}
6. Instanziierung von Objekten
Klasse Person{
Privat:
int Alter;
öffentlich:
Person(){}
Person(int a){
Alter = a ;
}
void fun(){….}
}
. . . . //Start der Hauptfunktion
Person p1; //Der Konstruktor ohne Parameter wird aufgerufen
Person p2(18); //Rufen Sie den parametrisierten Konstruktor auf
p1.fun(); //Mitgliedsfunktion aufrufen
p2.fun();
Um ein Objekt in Java zu instanziieren, müssen Sie das Schlüsselwort new verwenden.
Klasse Person{
privater String-Name;
privates int Alter;
öffentliche Person(){}
öffentliche Person(String name, int age){
this.name = Name;
this.age = Alter;
}
public void fun() {…..}
}
. . . . . //Start der Hauptfunktion
Person p1 = null ;
p1 = new Person(); //Sie müssen das Schlüsselwort new verwenden, um Speicherplatz freizugeben und den Konstruktor ohne Parameter aufzurufen.
Person p2 = new Person("Zhang San", 18); //Rufen Sie den parametrisierten Konstruktor auf.
p1.fun(); //Methode aufrufen
p2.fun();
7. Dieses Schlüsselwort
In C++ wird er als dieser Zeiger bezeichnet. Wenn ein Objekt instanziiert wird, wird dieser Zeiger standardmäßig generiert, um auf dieses Objekt zu zeigen. Er wird vom Compiler verwendet, um verschiedene Objekte derselben Klasse zu unterscheiden. Das heißt, als Objekt. Wenn Sie eine Mitgliedsfunktion verwenden, wissen Sie über diesen Zeiger, um welches Objekt es sich handelt, und rufen die Mitgliedsfunktion auf, um die Mitgliedseigenschaften des Objekts zu bedienen.
Dies hat in Java drei Verwendungszwecke:
1. Stellt die Attribute oder Methoden in dieser Klasse dar. So wie dieses. Methode, das. Eigentum.
2. Stellt das aktuelle Objekt dar.
3. Rufen Sie die Konstruktormethode dieser Klasse auf. Zum Beispiel this(), this(Parameter 1, Parameter 2...).
[Die Funktionen der Verwendungen 1 und 2 ähneln dem this-Zeiger in C++. 】
8. Objektmitglieder aufrufen
C++ übergibt Objekte. Member-Funktion oder aufzurufende Klassenzeiger->Member-Funktion.
In Java können Sie nur Objekte übergeben. Member-Funktionsaufruf.
Die Mitglieder des statischen Attributs der beiden können direkt über den Klassennamen übergeben werden. Mitgliedsfunktionen werden direkt aufgerufen.
9. Unterklasse -> Übergeordnete Klasse, die vom Konstruktor übergebenen Parameter haben etwas gemeinsam: Wenn der Konstruktor in der Unterklasse nicht klar angibt, welcher Konstruktor der übergeordneten Klasse aufgerufen werden soll, ruft das System standardmäßig den parameterlosen Konstruktor der übergeordneten Klasse auf Klasse. Wenn gleichzeitig die übergeordnete Klasse einen Konstruktor mit Parametern definiert, ist es am besten, einen Konstruktor ohne Parameter zu definieren.
Klasse Person{
Privat:
int Alter;
öffentlich:
Person(){}
Person(int a){
Alter = a ;
}
}
Klasse Student: öffentliche Person{
Privat:
int-Punktzahl;
öffentlich:
Student(int a, int s):Person(a){ //Übergabe an den Konstruktor der übergeordneten Klasse
Punktzahl = s;
}
}
Klasse Person{
privater String-Name;
privates int Alter;
öffentliche Person(){}
öffentliche Person(String name, int age){
this.name = Name;
this.age = Alter;
}
}
Klasse Student erweitert Person{
privater int-Score;
public Student(String name, int age, int score){
super(name,age); //an den Konstruktor der übergeordneten Klasse übergeben
this.score = Punktzahl;
}
}
10. Polymorphismus
Polymorphismus in C++ muss durch [virtuelle Funktion oder rein virtuelle Funktion + Unterklassenabdeckung der virtuellen Funktion oder rein virtuellen Funktion] erreicht werden.
Virtuelle Funktionen werden mit virtual deklariert,
wie:
virtual void fun(); //Deklaration innerhalb der Klasse
void Klassenname: fun() {….}//Implementierung außerhalb der Klasse
Java verwendet Unterklassen, um gewöhnliche Methoden in gewöhnlichen übergeordneten Klassen zu überschreiben, Unterklassen, um gewöhnliche Methoden oder abstrakte Methoden in abstrakten Klassen zu überschreiben, und Unterklassen, um abstrakte Methoden in Schnittstellen zu überschreiben. +Transformation nach oben.
Abstrakte Methoden werden mit abstract deklariert und haben keine Inhaltsimplementierung.
wie:
abstract void fun(); //Keine Implementierung innerhalb der Klasse
11. Abstrakte Klassen Keine der abstrakten Klassen kann Objekte instanziieren. Reine virtuelle Funktionen und abstrakte Methoden haben ähnliche Konzepte und ähnliche Funktionen.
Man kann auch sagen, dass es in C++ abstrakte Klassen gibt, also Klassen mit rein virtuellen Funktionen.
Eine rein virtuelle Funktion ist eine virtuelle Funktion ohne Inhaltsimplementierung und „=0“ und kann keine Objekte instanziieren.
wie:
virtual void fun() = 0; //Innerhalb der Klasse als =0 deklariert, außerhalb der Klasse nicht implementiert.
Eine abstrakte Klasse in Java ist eine Klasse, die mit dem Schlüsselwort abstract deklariert wird und abstrakte Methoden enthält. Das Objekt kann nicht instanziiert werden.
Eine Schnittstelle in Java ist eine spezielle Klasse oder eine spezielle abstrakte Klasse. Es besteht aus allen statischen Konstanten und abstrakten Funktionen.
12. Zugriffsrechte
C++ verwendet drei Vererbungsmethoden, um die Zugriffsrechte von Mitgliedern zwischen Unterklassen und übergeordneten Klassen zu ändern.
Klasse Student: öffentliche Person{
öffentlich:
. . . . . .
Privat:
. . . . . .
};
Klassenarbeiter: geschützte Person{
öffentlich:
. . . . . .
Privat:
. . . . . .
};
Klasse Landwirt: Privatperson{
öffentlich:
. . . . . .
Privat:
. . . . . .
};
Java implementiert Zugriffsberechtigungen für Mitglieder zwischen verschiedenen Klassen über den Paketmechanismus.
Paket org.tyut.a
Klasse Person{
Privat…..
Privat……
öffentlich…….
öffentlich…
}
Paket org.tuyt.b
Klasse Person{
Privat…..
Privat……
öffentlich…….
öffentlich…
}
Paket org.tuyt.c
Klasse Person{
Privat…..
Privat……
öffentlich…….
öffentlich…
}
13. Die Idee der C++-Vorverarbeitung und des Java-Importpakets ist dieselbe: Wenn Sie eine andere Klasse als die aktuelle Klasse verwenden möchten,
Verwenden Sie in C++ die Vorkompilierungsanweisung #include vor der Klassendefinition, um die einzubindende Klassenbibliothek einzuschließen.
Standardklassenbibliotheken verwenden spitze Klammern < > ohne h. Verwenden Sie in der benutzerdefinierten Klassenbibliothek doppelte Anführungszeichen „“ mit h. Die Suche erfolgt dann zuerst vom aktuellen Pfad aus.
wie:
#include <iostream>
#include „demo.h“
Um in Java die Klasse zu importieren, die Sie verwenden möchten, verwenden Sie den Importbefehl und geben Sie das Paket an, in dem sich die Klasse befindet.
wie:
Java importieren. Lang. *;
Importorganisation. Tyut. *;