Übungen zum C++-Konzept

Inhaltsverzeichnis

1. Speicherverwaltung 

2. Überlastung des Bedieners

3. dieser Zeiger

4. Konstruktion und Zerstörer

5. Vorlage 


1. Speicherverwaltung 

Welche der folgenden Aussagen zum C++-Speicherzuordnungsstapel ist falsch ()

A. Für den Stapel wird er automatisch vom Compiler verwaltet und erfordert keine manuelle Steuerung; für den Heap wird die Freigabearbeit vom Programmierer gesteuert.

B. Beim Stapel ist die Wachstumsrichtung nach unten gerichtet, also in Richtung abnehmender Speicheradressen; beim Heap ist die Wachstumsrichtung nach oben gerichtet, also in Richtung zunehmender Speicheradressen.

C. Für den Heap führt häufiges Neuen/Löschen unweigerlich zu einer Diskontinuität im Speicherbereich, was zu einer großen Anzahl von Fragmenten führt und die Programmeffizienz verringert. Bei Stacks besteht dieses Problem nicht

D. Im Allgemeinen kann der Heap-Speicher unter einem 32-Bit-System 4 GB Speicherplatz erreichen, für den Stapel gibt es jedoch im Allgemeinen eine bestimmte Speicherplatzgröße.

  • A. Der Stapelbereich enthält hauptsächlich lokale Variablen und Funktionsparameter. Die Verwaltung seines Speicherplatzes wird vom Compiler automatisch ohne manuelle Steuerung abgeschlossen. Der Heap-Bereich ist ein Speicherplatz, den Sie beantragen und der manuell freigegeben werden muss, wenn er nicht mehr benötigt wird .

  • B. Die zuerst im Stapelbereich definierten Variablen werden mit einer hohen Adresse unten im Stapel platziert, und die später definierten Variablen werden mit einer niedrigen Adresse oben im Stapel platziert, sodass sie nach unten wachsen. Das Gegenteil ist der Fall für den Heap-Bereich.

  • C. Häufiges Anwenden und Freigeben von Speicherplatz kann leicht zu Speicherfragmentierung und sogar Speicherlecks führen. Da der Stapelbereich automatisch verwaltet wird, besteht dieses Problem nicht.

  • D. Unter einem 32-Bit-System beträgt der maximale Zugriffsspeicherplatz 4G, daher ist es unmöglich, den gesamten Speicherplatz als Heap-Speicher zu verwenden, was falsch ist.

Welche Aussage zu Heap und Stack in C++ ist falsch: ( )

Antwort: Die Größe des Heaps wird nur durch das Betriebssystem begrenzt, und die Größe des Stapels ist im Allgemeinen kleiner.

B. Häufige Aufrufe von new/delete auf dem Heap führen zu einer Speicherfragmentierung, beim Stack tritt dieses Problem jedoch nicht auf.

C. Sowohl der Heap als auch der Stack können statisch zugewiesen werden

D. Sowohl der Heap als auch der Stack können dynamisch zugewiesen werden

  • A. Die Heap-Größe wird durch das Betriebssystem begrenzt, während der Stack-Speicherplatz im Allgemeinen direkt vom System zugewiesen wird.
  • B. Häufiges Anwenden und Freigeben von Speicherplatz kann leicht zu Speicherfragmentierung und sogar Speicherlecks führen. Da der Stapelbereich automatisch verwaltet wird, besteht dieses Problem nicht.
  • C. Der Heap kann nicht statisch, sondern nur dynamisch zugewiesen werden.
  • D. Der Stapel kann dynamisch über die Funktion _alloca zugewiesen werden. Beachten Sie jedoch, dass der zugewiesene Speicherplatz nicht durch Freigeben oder Löschen freigegeben werden kann.

 

ClassA *pclassa=new ClassA[5];

delete pclassa;

In der Sprache C++ betragen die Ausführungszeiten des Konstruktors und Destruktors der Klasse ClassA ()

A.5,1

B.1,1

C.5,5

D. Das Programm kann abstürzen

  • A. Bei der Beantragung eines Objektarrays wird der Konstruktor fünfmal aufgerufen. Da delete [] nicht verwendet, wird der Destruktor nur einmal aufgerufen, was jedoch häufig zum Absturz des Programms führt.
  • B. Der Konstruktor wird fünfmal aufgerufen
  • C. Der Destruktor wird zu diesem Zeitpunkt nur einmal aufgerufen. Um den Array-Speicherplatz vollständig freizugeben, müssen Sie [] verwenden.
  • D. Richtig

 Verwenden Sie char* p = new char[100], um einen Teil des Speichers zu beantragen, und verwenden Sie dann delete p, um ihn freizugeben. Was ist das Problem? ( )

A. Es wird ein Speicherverlust auftreten

B. Es tritt kein Speicherverlust auf, die Verwendung wird jedoch nicht empfohlen.

C. Beim Kompilieren wird ein Fehler gemeldet. Sie müssen delete [] p verwenden.

D. Beim Kompilieren gibt es kein Problem, aber beim Ausführen stürzt es direkt ab.

  • A. Bei integrierten Typen entspricht das Löschen zu diesem Zeitpunkt dem Freigeben, sodass es nicht zu Speicherverlusten kommt.
  • B.Richtig
  • C. Die Kompilierung meldet keinen Fehler. Es wird empfohlen, delete[] für die Array-Freigabe zu verwenden. Wenn es sich um einen benutzerdefinierten Typ handelt, tritt ein Laufzeitfehler auf, wenn keine eckigen Klammern verwendet werden.
  • D. Bei integrierten Typen stürzt das Programm nicht ab, diese Verwendung wird jedoch nicht empfohlen

 

int globalVar = 1;

static int staticGlobalVar = 1;

void Test()

{

static int staticVar = 1;

int localVar = 1;



int num1[10] = {1, 2, 3, 4};

char char2[] = "abcd";

char* pChar3 = "abcd";

int* ptr1 = (int*)malloc(sizeof (int)*4);

int* ptr2 = (int*)calloc(4, sizeof(int));

int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);

free (ptr1);

free (ptr3);

}

1. Multiple-Choice-Fragen:

  Optionen: A. Stapel B. Heap C. Datensegment (statischer Bereich) D. Codesegment (konstanter Bereich)

  Wo ist globalVar? __C__ Wo ist staticGlobalVar? __C__

  Wo ist staticVar? __C__ Wo ist localVar? __A__

  Wo ist Nummer1? __A__

 Wo ist char2? __A__ Wo ist *char2? __A__

  Wo ist pChar3? __A__ *Wo ist pChar3? __D__

  Wo ist ptr1? __A__ *Wo ist ptr1? __B__

  analysieren:

  • Die globalen Variablen globalVar befinden sich im Datensegment staticGlobalVar statische globale Variablen befinden sich im statischen Bereich
  • Die statische lokale Variable „staticVar“ befindet sich im statischen Bereich. Die lokale Variable „localVar“ befindet sich im Stapelbereich
  • Die lokale Variable num1 befindet sich im Stapelbereich
  • Die lokale Variable char2 befindet sich im Stapelbereich  
  • char2 ist ein Array. Kopieren Sie die folgende konstante Zeichenfolge in das Array. Das Array befindet sich auf dem Stapel, also befindet sich *char2 auf dem Stapel.

  • Die lokale Variable pChar3 befindet sich im Stapelbereich. *pChar3 ruft das Zeichen der Zeichenfolgenkonstante im Codesegment ab.

  • Die lokale Variable ptr1 befindet sich im Stapelbereich. *ptr1 ruft die Daten des dynamisch angewendeten Speicherplatzes im Heap-Bereich ab.

2. Füllen Sie die Lücken aus:

  sizeof(num1) = __40__;//Array-Größe, 10 Ganzzahldaten insgesamt 40 Bytes

  sizeof(char2) = __5__;//Einschließlich \0 Leerzeichen

  strlen(char2) = __4__;//Die Länge beinhaltet nicht \0

  sizeof(pChar3) = __4__;//pChar3 ist ein Zeiger

  strlen(pChar3) = __4__;//Die Länge der Zeichenfolge „abcd“, ohne die Länge von \0

  sizeof(ptr1) = __4__;//ptr1 ist ein Zeiger

2. Überlastung des Bedieners

Welche der folgenden Beschreibungen zur Überladung des Zuweisungsoperators „=" ist richtig ( )

A. Der Zuweisungsoperator kann nur als Mitgliedsfunktion einer Klasse überladen werden

B. Der Standardzuweisungsoperator implementiert die Funktion „Deep Copy“.

C. Die überladene Zuweisungsoperatorfunktion verfügt über zwei Objekte dieser Klasse als formale Parameter

D. Wenn der Kopierkonstruktor definiert wurde, kann der Zuweisungsoperator nicht überladen werden

  • A. Wenn der Zuweisungsoperator nicht explizit in der Klasse implementiert ist, generiert der Compiler einen Standardoperator. Wenn der Benutzer zu diesem Zeitpunkt den Zuweisungsoperator außerhalb der Klasse als global überlädt, kommt es zu einem Konflikt mit dem von der Klasse generierten Standardzuweisungsoperator Compiler. Daher kann der Zuweisungsoperator nur als Mitgliedsfunktion überladen werden
  • B. Der Standardzuweisungsoperator ist Mitglied für Mitglied, was eine flache Zuweisung darstellt.
  • C. Es gibt nur einen Parameter und der andere wird über diesen Zeiger übergeben
  • D. Die Aufrufszenarien der beiden Funktionen sind unterschiedlich und haben keinen Einfluss aufeinander.

3. dieser Zeiger

Welche der folgenden Aussagen zur Verwendung dieses Zeigers ist richtig ( )

A. Stellen Sie sicher, dass in Unterklassen auf geschützte Mitglieder der Basisklasse zugegriffen werden kann

B. Stellen Sie sicher, dass in Unterklassen auf private Mitglieder der Basisklasse zugegriffen werden kann

C. Stellen Sie sicher, dass in Unterklassen auf öffentliche Mitglieder der Basisklasse zugegriffen werden kann

D. Stellen Sie sicher, dass jedes Objekt über eigene Datenelemente verfügt, aber den Code, der diese Daten verarbeitet, gemeinsam nutzt

  • A. Auf geschützte Mitglieder der Basisklasse kann in Unterklassen direkt zugegriffen werden und hat damit nichts zu tun.
  • B. Auf private Mitglieder der Basisklasse kann in der Unterklasse nicht zugegriffen werden und sie haben damit nichts zu tun.
  • C. Auf alle Mitglieder der Basisklasse kann direkt außerhalb von Unterklassen und Objekten zugegriffen werden und hat damit nichts zu tun.
  • D. Dieser Zeiger stellt das aktuelle Objekt dar und kann die eigenen Daten jedes Objekts unterscheiden, sodass er korrekt ist

 Die folgende Fehlerbeschreibung lautet ( )

A. Dieser Zeiger ist ein impliziter formaler Parameter einer nicht statischen Mitgliedsfunktion.

B. Jede nicht statische Memberfunktion verfügt über einen this-Zeiger.

C. Dieser Zeiger ist im Objekt vorhanden.

D. Dieser Zeiger kann null sein

  • A. Statische Memberfunktionen haben diese Zeiger nicht, nur nicht statische Memberfunktionen haben sie und es handelt sich um versteckte Zeiger.
  • B. Der erste Parameter einer nicht statischen Memberfunktion ist der versteckte Zeiger this
  • C. Dieser Zeiger befindet sich in einer nicht statischen Mitgliedsfunktion und das Objekt existiert nicht, es handelt sich also um einen Fehler.
  • D. Es ist nicht möglich, diesem einfach eine Null zuzuweisen, aber es kann erzwungen werden, direkt eine Null zuzuweisen, aber dieser Vorgang wird im Allgemeinen nicht ausgeführt.

4. Konstruktion und Zerstörer

In Funktion F ist die Aufrufreihenfolge der Konstruktoren und Destruktoren der lokalen Variablen a und b: ( )

Class A;

Class B;

void F() {
    A a;
    B b;
}

A.b Aufbau, a Aufbau, a Zerstörung, b Zerstörung

B.a Aufbau, Zerstörung, b Aufbau, b Zerstörung

C. b Aufbau, ein Aufbau, b Zerstörung, eine Zerstörung

D.a Aufbau b Aufbau b Zerstörung eine Zerstörung

  •  A. Die Konstruktionsreihenfolge besteht darin, in der Reihenfolge der Anweisungen zu konstruieren, und die Zerstörung erfolgt in umgekehrter Reihenfolge der Konstruktion. Daher ist es falsch, zuerst b zu konstruieren.
  • B. Der Zeitpunkt der Zerstörung von a ist falsch. Das Objekt wird erst zerstört, wenn der Überlebensbereich endet. Daher ist es falsch, zuerst a zu zerstören.
  • C. Der Konstruktionszeitpunkt von b ist falsch. Konstruieren Sie zuerst a
  • D. Richtig, die Konstruktionsreihenfolge entspricht der Reihenfolge der Aussagen und die Zerstörung erfolgt in der umgekehrten Konstruktionsreihenfolge.

 Angenommen, es sind bereits vier Klassen A, B, C und D definiert. In welcher Reihenfolge werden die Destruktoren von A, B, C und D im Programm aufgerufen? ( )

C c;

int main()
{
	A a;
	B b;
	static D d;

    return 0;
}

A.D. B. A. C

B.B A D C

C.C.D.B.A

D.A.B.D.C

  1.  Die Destruktoraufrufe einer Klasse werden im Allgemeinen in umgekehrter Reihenfolge wie die Konstruktoraufrufe aufgerufen. Achten Sie jedoch auf die Existenz statischer Objekte, da statische Objekte den Überlebensbereich des Objekts ändern und Sie zuvor auf das Ende des Programms warten müssen Zerstörung und Freigabe des Objekts.
  2. Globale Objekte werden vor lokalen Objekten erstellt
  3. Lokale Objekte werden in der Reihenfolge ihres Auftretens erstellt, unabhängig davon, ob sie statisch sind oder nicht
  4. Die Reihenfolge der Konstruktion ist also c a b d
  5. Die Reihenfolge der Zerstörung ist die umgekehrte Reihenfolge der Konstruktion. Beachten Sie jedoch, dass nach einer statischen Änderung des Überlebensbereichs des Objekts dieses nach dem lokalen Objekt zerstört wird.
  6. Daher lautet die Vernichtungsreihenfolge B A D C

 Die Eigenschaften des Kopierkonstruktors sind ( )

A. Die Funktion hat den gleichen Namen und ist ebenfalls ein Konstruktor. Die Funktion gibt ihre eigene Referenz zurück.

B. Diese Funktion hat nur einen Parameter, der eine Referenz auf ein Objekt ist.

C. Jede Klasse muss über einen Kopierinitialisierungskonstruktor verfügen. Wenn in der Klasse kein Kopierkonstruktor angegeben ist, generiert das Compilersystem automatisch einen Standardkopierkonstruktor als geschütztes Mitglied der Klasse.

D. Die Funktion des Kopierinitialisierungskonstruktors besteht darin, die Datenelementwerte eines bekannten Objekts in ein anderes Objekt desselben Typs zu kopieren, das erstellt wird.

  •  A. Der Kopierkonstruktor ist auch ein Konstruktor und kann daher keinen Rückgabewert haben
  • B. Der Funktionsparameter ist eine Referenz auf ein Objekt seines eigenen Typs
  • C. Der automatisch generierte Standardkopierkonstruktor wird als öffentliches Mitglied der Klasse verwendet, andernfalls kann der Standardkopierkonstruktor nicht ausgeführt werden.
  • D. Das Initialisieren des Objekts mit dem Objekt ist die Aufgabe des Kopierkonstruktors und daher korrekt

5. Vorlage 

Was die folgenden Gründe betrifft, warum Vorlagenklassen in C++ verwendet werden: Welcher ist falsch? ( )

A. Kann zum Erstellen von Datenstrukturen verwendet werden, die dynamisch wachsen und schrumpfen

B. Es ist typunabhängig und daher hochgradig wiederverwendbar

C. Es prüft den Datentyp zur Laufzeit, um die Typsicherheit zu gewährleisten

D. Es ist plattformunabhängig und portabel

  • A. Vorlagen können nicht typspezifische Parameter zur Angabe der Größe haben, und dynamische Strukturen können basierend auf der angegebenen Größe erstellt werden.
  • B. Das Wichtigste an Vorlagen ist, dass sie typunabhängig sind, was die Wiederverwendbarkeit des Codes verbessert.
  • C. Die Vorlage überprüft beim Ausführen weder den Datentyp noch gewährleistet sie die Typsicherheit. Dies entspricht einer Makroersetzung des Typs und ist daher falsch.
  • D. Solange die Vorlagensyntax unterstützt wird, ist der Vorlagencode portierbar

 Welche der folgenden Aussagen zu Vorlagen ist richtig ( )

A. Aktuelle Parameter der Vorlage können jederzeit weggelassen werden

B. Klassenvorlage und Vorlagenklasse beziehen sich auf dasselbe Konzept

C. Die Parameter der Klassenvorlage müssen vom virtuellen Typ sein

D. Alle Mitgliedsfunktionen in einer Klassenvorlage sind Vorlagenfunktionen

  • A. Nicht unbedingt. Wenn die Parametertypen unterschiedlich sind, ist es manchmal erforderlich, die angegebenen Typparameter anzuzeigen.
  • B. Eine Klassenvorlage ist eine Klassenfamilie und eine Vorlagenklasse ist eine bestimmte Klasse, die durch eine Klassenvorlage instanziiert wird.
  • Das Deklarationsformat einer Klassenvorlage in C.C++ ist template
  • D. Richtig, alle Definitionen müssen durch vollständige Vorlagensyntax definiert werden.

Guess you like

Origin blog.csdn.net/m0_73800602/article/details/134741643