Einführung in C ++ - Klassen und Objekte

click fraud protection

01

von 09

C ++ - Klassen starten

Hände tippen auf Laptop
Sam Edwards / Getty Images

Objekte sind der größte Unterschied zwischen C ++ und C. Einer der frühesten Namen für C ++ war C mit Klassen.

Klassen und Objekte

Eine Klasse ist eine Definition eines Objekts. Es ist ein Typ wie int. Eine Klasse ähnelt a struct mit nur einem Unterschied: Alle Strukturmitglieder sind standardmäßig öffentlich. Alle Klassenmitglieder sind privat.

Denken Sie daran: Eine Klasse ist ein Typ, und ein Objekt dieser Klasse ist nur ein Variable.

Bevor wir ein Objekt verwenden können, muss es erstellt werden. Die einfachste Definition einer Klasse lautet:

 Klassenname {

 // Mitglieder

 }


Diese Beispielklasse unten modelliert ein einfaches Buch. Mit OOP können Sie das Problem abstrahieren und darüber nachdenken und nicht nur über beliebige Variablen.

 // Beispiel eins

 #umfassen 

 #umfassen 


 Klassenbuch

 {

 int PageCount;

 int CurrentPage; 

 Öffentlichkeit:

 Buch (int Numpages); // Konstrukteur

 ~ Book () {}; // Destruktor

 void SetPage (int PageNumber);

 int GetCurrentPage (void);
instagram viewer

 }; 


 Buch:: Buch (int NumPages) {

 PageCount = NumPages;

 }


 void Book:: SetPage (int PageNumber) {

 CurrentPage = PageNumber;

 }


 int Book:: GetCurrentPage (void) {

 return CurrentPage;

 }


 int main () {

 Buch ABook (128);

 Ein Buch. SetPage (56);

 std:: cout << "Aktuelle Seite" << ABook. GetCurrentPage () << std:: endl;

 return 0;

 }


Der gesamte Code von Klassenbuch runter zum int Book:: GetCurrentPage (void) { Funktion ist Teil der Klasse. Das Main() Funktion ist da, um dies zu einer ausführbaren Anwendung zu machen.

02

von 09

Die Buchklasse verstehen

In dem Main() Funktion Eine Variable ABook vom Typ Book wird mit dem Wert 128 erstellt. Sobald die Ausführung diesen Punkt erreicht, wird das Objekt ABook erstellt. In der nächsten Zeile die Methode Ein Buch. SetPage () wird aufgerufen und der Objektvariable der Wert 56 zugewiesen Ein Buch. Aktuelle Seite. Dann cout gibt diesen Wert durch Aufrufen von aus Ein Buch. GetCurrentPage () Methode.

Wenn die Ausführung die erreicht return 0; Das ABook-Objekt wird von der Anwendung nicht mehr benötigt. Der Compiler generiert einen Aufruf an den Destruktor.

Klassen deklarieren

Alles dazwischen Klassenbuch und die } ist die Klassendeklaration. Diese Klasse hat zwei private Mitglieder, beide vom Typ int. Diese sind privat, da der Standardzugriff auf Klassenmitglieder privat ist.

Das Öffentlichkeit: Direktive sagt die Compiler Der Zugriff von hier an ist öffentlich. Ohne dies wäre es immer noch privat und würde verhindern, dass die drei Zeilen in der main () - Funktion auf Abook-Mitglieder zugreifen. Versuchen Sie das zu kommentieren Öffentlichkeit: Line Out und Neukompilieren, um die folgenden Kompilierungsfehler zu sehen.

Diese Zeile unten deklariert einen Konstruktor. Dies ist die Funktion, die beim ersten Erstellen des Objekts aufgerufen wird.

 Buch (int Numpages); // Konstrukteur 

Es wird von der Leitung aufgerufen

 Buch ABook (128); 

Dadurch wird ein Objekt namens ABook vom Typ Book erstellt und die Funktion Book () mit dem aufgerufen Parameter 128.

03

von 09

Mehr über die Buchklasse

In C ++ hat der Konstruktor immer den gleichen Namen wie die Klasse. Der Konstruktor wird beim Erstellen des Objekts aufgerufen. Hier sollten Sie Ihren Code einfügen, um das Objekt zu initialisieren.

In Buch Die nächste Zeile nach dem Konstruktor der Destruktor. Dies hat den gleichen Namen wie der Konstruktor, jedoch mit einem ~ (Tilde) davor. Während der Zerstörung eines Objekts wird der Destruktor aufgerufen, um das Objekt aufzuräumen und sicherzustellen, dass Ressourcen wie Speicher und Dateihandle, die vom Objekt verwendet werden, freigegeben werden.

Merken- Eine Klasse xyz hat eine Konstruktorfunktion xyz () und eine Destruktorfunktion ~ xyz (). Auch wenn Sie nicht deklarieren, fügt der Compiler sie stillschweigend hinzu.

Der Destruktor wird immer aufgerufen, wenn das Objekt beendet wird. In diesem Beispiel wird das Objekt implizit zerstört, wenn es den Gültigkeitsbereich verlässt. Ändern Sie dazu die Destruktordeklaration wie folgt:

 ~ Book () {std:: cout << "Destruktor aufgerufen";}; // Destruktor 

Dies ist eine Inline-Funktion mit Code in der Deklaration. Eine andere Möglichkeit zum Inline-Hinzufügen ist das Hinzufügen des Wortes Inline

 Inline ~ Buch (); // Destruktor


und fügen Sie den Destruktor als eine Funktion wie diese hinzu.

 Inline-Buch:: ~ Buch (nichtig) { 

 std:: cout << "Destruktor aufgerufen";

 }


Inline-Funktionen sind Hinweise für den Compiler, um effizienteren Code zu generieren. Sie sollten nur für kleine Funktionen verwendet werden, aber wenn sie an geeigneten Stellen verwendet werden - beispielsweise im Inneren Schleifen- kann einen erheblichen Leistungsunterschied bewirken.

04

von 09

Klassenmethoden schreiben

Beste Übung Bei Objekten müssen alle Daten privat gemacht und über Funktionen, die als Zugriffsfunktionen bezeichnet werden, darauf zugegriffen werden. SetPage () und GetCurrentPage () sind die beiden Funktionen, mit denen auf die Objektvariable zugegriffen wird Aktuelle Seite.

Ändere das Klasse Deklaration zum Strukturieren und Neukompilieren. Es sollte immer noch kompiliert und korrekt ausgeführt werden. Nun die beiden Variablen Seitenzahl und Aktuelle Seite sind öffentlich zugänglich. Fügen Sie diese Zeile nach dem Buch ABook (128) hinzu, und es wird kompiliert.

 Ein Buch. PageCount = 9;


Wenn Sie die Struktur wieder auf ändern Klasse und neu kompilieren, diese neue Zeile wird nicht mehr als kompiliert Seitenzahl ist jetzt wieder privat.

Die:: Notation

Nach dem Hauptteil der Buchklassendeklaration gibt es die vier Definitionen der Mitgliedsfunktionen. Jedes wird mit dem Präfix Book:: definiert, um es als zu dieser Klasse gehörend zu identifizieren.:: wird als Bereichskennung bezeichnet. Es identifiziert die Funktion als Teil der Klasse. Dies ist in der Klassendeklaration offensichtlich, jedoch nicht außerhalb.

Wenn Sie eine Mitgliedsfunktion in einer Klasse deklariert haben, müssen Sie den Hauptteil der Funktion auf diese Weise bereitstellen. Wenn Sie möchten, dass die Book-Klasse von anderen Dateien verwendet wird, können Sie die Buchdeklaration in eine separate verschieben Header Datei, vielleicht book.h genannt. Jede andere Datei könnte sie dann enthalten

 #include "book.h" 

05

von 09

Vererbung und Polymorphismus

Dieses Beispiel zeigt die Vererbung. Dies ist eine Zwei-Klassen-Anwendung, bei der eine Klasse von einer anderen abgeleitet ist.

 #umfassen 

 #umfassen 


 Klasse Punkt

 {


 int x, y;

 Öffentlichkeit:

 Punkt (int atx, int aty); // Konstrukteur

 Inline Virtual ~ Point (); // Destruktor

 virtuelle Leere Draw ();

 }; 


 Klassenkreis: öffentlicher Punkt {


 int Radius;

 Öffentlichkeit:

 Kreis (int atx, int aty, int theRadius);

 Inline Virtual ~ Circle ();

 virtuelle Leere Draw ();

 };



 Point:: Point (int atx, int aty) {

 x = atx;

 y = aty;

 }


 Inline Point:: ~ Point (void) { 

 std:: cout << "Point Destructor aufgerufen";

 }


 void Point:: Draw (void) {

 std:: cout << "Point:: Draw point at" << x << "" << y << std:: endl;

 }



 Kreis:: Kreis (int atx, int aty, int theRadius): Punkt (atx, aty) {

 Radius = theRadius;

 }


 Inline-Kreis:: ~ Kreis () {

 std:: cout << "Kreiszerstörer namens" << std:: endl;

 }


 void Circle:: Draw (void) {

 Point:: Draw ();

 std:: cout << "circle:: Draw point" << "Radius" << radius << std:: endl;

 }


 int main () {

 Kreis ACircle (10,10,5);

 Ein Kreis. Zeichnen() ;

 return 0;

 }


Das Beispiel besteht aus zwei Klassen, Punkt und Kreis, die einen Punkt und einen Kreis modellieren. Ein Punkt hat x- und y-Koordinaten. Die Circle-Klasse wird von der Point-Klasse abgeleitet und fügt einen Radius hinzu. Beide Klassen umfassen a Zeichnen() Mitgliedsfunktion. Um dieses Beispiel kurz zu halten, ist die Ausgabe nur Text.

06

von 09

Erbe

Die Klasse Kreis wird abgeleitet von der Punkt Klasse. Dies geschieht in dieser Zeile:

 Klasse Kreis: Punkt {


Da Circle von einer Basisklasse (Point) abgeleitet ist, erbt Circle alle Klassenmitglieder.

 Punkt (int atx, int aty); // Konstrukteur

 Inline Virtual ~ Point (); // Destruktor

 virtuelle Leere Draw ();


 Kreis (int atx, int aty, int theRadius);

 Inline Virtual ~ Circle ();

 virtuelle Leere Draw ();


Stellen Sie sich die Kreisklasse als die Punktklasse mit einem zusätzlichen Element (Radius) vor. Es erbt die Memberfunktionen der Basisklasse und private Variablen x und y.

Diese können nur implizit zugewiesen oder verwendet werden, da sie privat sind. Daher muss dies über die Initialisierungsliste des Circle-Konstruktors erfolgen. Dies sollten Sie vorerst akzeptieren. Ich werde in einem zukünftigen Tutorial auf die Initialisierungslisten zurückkommen.

Im Kreiskonstruktor zuvor der Radius ist dem zugeordnet RadiusDer Punktteil von Circle wird durch einen Aufruf des Konstruktors von Point in der Initialisierungsliste erstellt. Diese Liste ist alles zwischen: und {unten.

 Kreis:: Kreis (int atx, int aty, int theRadius): Punkt (atx, aty) 


Im Übrigen kann die Konstruktortypinitialisierung für alle integrierten Typen verwendet werden.

 int a1 (10);

 int a2 = 10;


Beide machen das Gleiche.

07

von 09

Was ist Polymorphismus?

Polymorphismus ist ein Oberbegriff, der "viele Formen" bedeutet. In C ++ ist die einfachste Form des Polymorphismus das Überladen von Funktionen. Zum Beispiel mehrere Funktionen aufgerufen SortArray (Array-Typ) wo sortarray ein sein könnte Array von Ints oder Doppel.

Wir interessieren uns hier jedoch nur für die OOP-Form des Polymorphismus. Dies erfolgt durch Erstellen einer Funktion (z. B. Draw ()). virtuell in der Basisklasse Point und überschreiben Sie es dann in der abgeleitete Klasse Kreis.

Obwohl die Funktion Zeichnen() ist in der abgeleiteten Klasse virtuell Kreis, das wird eigentlich nicht benötigt - es erinnert mich nur daran, dass es virtuell ist. Wenn die Funktion in einer abgeleiteten Klasse hinsichtlich Name und Parametertyp mit einer virtuellen Funktion in der Basisklasse übereinstimmt, ist sie automatisch virtuell.

Das Zeichnen eines Punktes und das Zeichnen eines Kreises sind zwei sehr unterschiedliche Operationen, bei denen nur die Koordinaten von Punkt und Kreis gemeinsam sind. Daher ist es wichtig, dass die richtigen sind Zeichnen() wird genannt. Wie der Compiler es schafft, Code zu generieren, der die richtige virtuelle Funktion erhält, wird in einem zukünftigen Tutorial behandelt.

08

von 09

C ++ - Konstruktoren

Konstruktoren

Ein Konstruktor ist eine Funktion, die die Elemente eines Objekts initialisiert. Ein Konstruktor kann nur ein Objekt seiner eigenen Klasse erstellen.

Konstruktoren werden nicht automatisch zwischen der Basisklasse und der abgeleiteten Klasse vererbt. Wenn Sie in der abgeleiteten Klasse keine angeben, wird eine Standardeinstellung bereitgestellt, die jedoch möglicherweise nicht das tut, was Sie möchten.

Wenn kein Konstruktor angegeben wird, wird vom Compiler ein Standardkonstruktor ohne Parameter erstellt. Es muss immer einen Konstruktor geben, auch wenn dieser standardmäßig leer ist. Wenn Sie einen Konstruktor mit Parametern angeben, wird KEIN Standard erstellt.

Einige Punkte zu Konstruktoren:

  • Konstruktoren sind nur Funktionen mit demselben Namen wie die Klasse.
  • Konstruktoren sollen die Mitglieder der Klasse initialisieren, wenn eine Instanz dieser Klasse erstellt wird.
  • Konstruktoren werden nicht direkt aufgerufen (außer über Initialisiererlisten)
  • Konstruktoren sind niemals virtuell.
  • Es können mehrere Konstruktoren für dieselbe Klasse definiert werden. Sie müssen unterschiedliche Parameter haben, um sie zu unterscheiden.

Es gibt noch viel mehr über Konstruktoren zu lernen, z. B. Standardkonstruktoren, Zuweisungen und Kopierkonstruktoren. Diese werden in der nächsten Lektion besprochen.

09

von 09

Aufräumen von C ++ - Destruktoren

Ein Destruktor ist eine Klassenmitgliedsfunktion, die denselben Namen wie der Konstruktor (und die Klasse) hat, jedoch ein ~ (Tilde) vor sich hat.

 ~ Kreis ();


Wenn ein Objekt den Gültigkeitsbereich verlässt oder seltener explizit zerstört wird, wird sein Destruktor aufgerufen. Wenn das Objekt beispielsweise dynamische Variablen wie Zeiger enthält, müssen diese freigegeben werden, und der Destruktor ist der geeignete Ort.

Im Gegensatz zu Konstruktoren können und sollten Destruktoren virtuell gemacht werden, wenn Sie Klassen abgeleitet haben. In dem Punkt und Kreis Beispiel: Der Destruktor wird nicht benötigt, da keine Bereinigungsarbeiten durchgeführt werden müssen (er dient nur als Beispiel). Hätte es dynamische Mitgliedsvariablen gegeben (wie Zeiger) dann hätten diese eine Freigabe erforderlich gemacht, um Speicherlecks zu verhindern.

Wenn die abgeleitete Klasse Mitglieder hinzufügt, die aufgeräumt werden müssen, werden virtuelle Destruktoren benötigt. Im virtuellen Zustand wird zuerst der am meisten abgeleitete Klassendestruktor aufgerufen, dann der Destruktor seines unmittelbaren Vorfahren und so weiter bis zur Basisklasse.

In unserem Beispiel

 ~ Kreis ();

dann

 ~ Point ();


Der Basisklassen-Destruktor heißt last.

Damit ist diese Lektion abgeschlossen. In der nächsten Lektion lernen Sie Standardkonstruktoren, Kopierkonstruktoren und Zuweisungen kennen.

instagram story viewer