top 70 c interview questions
Am häufigsten gestellte grundlegende und fortgeschrittene C ++ - Interviewfragen mit Codebeispielen für Einsteiger sowie erfahrene Fachleute:
Dieser ausführliche Artikel wird sicherlich ein Lesezeichen für diejenigen sein, die sich auf ein C ++ - Interview vorbereiten.
Fast alle wichtigen Themen in C ++ werden hier behandelt, zusammen mit einigen grundlegenden Fragen zu fortgeschrittenen Themen wie Standard Template Library (STL) usw.
Diese Fragen zur C ++ - Codierung helfen Ihnen dabei, sich jedem C ++ - Interview sicher zu stellen und es beim ersten Versuch erfolgreich zu klären.
Was du lernen wirst:
- C ++ - Interviewfragen mit Codebeispielen
C ++ - Interviewfragen mit Codebeispielen
Nachfolgend finden Sie die beliebtesten Fragen zu C ++ - Programmierinterviews, die von einem C ++ - Experten beantwortet werden.
Lesen Sie auch => Top C Programming Interview Fragen
Grundlegendes C ++
Struktur des C ++ - Programms
F # 1) Wie ist die Grundstruktur eines C ++ - Programms?
Antworten: Die Grundstruktur eines C ++ - Programms ist unten dargestellt:
#include int main() { cout<<”Hello,World!”; return 0; }
Die erste Zeile, die mit „ # ' ist ein Präprozessor-Direktive . In diesem Fall verwenden wir einschließen als Direktive, die den Compiler anweist, einen Header einzuschließen, während “ iostream.h ”, Die später im Programm für die grundlegende Eingabe / Ausgabe verwendet wird.
Die nächste Zeile ist die Hauptfunktion, die eine Ganzzahl zurückgibt. Die Hauptfunktion ist der Ausgangspunkt für die Ausführung eines beliebigen C ++ - Programms. Unabhängig von ihrer Position in der Quellcodedatei wird der Inhalt der Hauptfunktion immer zuerst vom C ++ - Compiler ausgeführt.
In der nächsten Zeile sehen wir offene geschweifte Klammern, die den Beginn eines Codeblocks anzeigen. Danach sehen wir die Programmieranweisung oder die Codezeile, die die Anzahl verwendet, die der Standardausgabestream ist (ihre Definition ist in iostream.h vorhanden).
Dieser Ausgabestream nimmt eine Zeichenfolge auf und druckt sie auf einem Standardausgabegerät aus. In diesem Fall heißt es 'Hallo Welt!'. Bitte beachten Sie, dass jeder C ++ - Befehl mit einem Semikolon (;) endet, was sehr wichtig ist. Wenn Sie es weglassen, führt dies zu Kompilierungsfehlern.
Vor dem Schließen der geschweiften Klammern} sehen wir eine weitere Zeile 'return 0;'. Dies ist der Rückkehrpunkt zur Hauptfunktion.
Jedes C ++ - Programm hat eine Grundstruktur wie oben gezeigt mit einer Präprozessoranweisung, einer Hauptfunktionsdeklaration, gefolgt von einem Codeblock und einem Rückgabepunkt zur Hauptfunktion, der die erfolgreiche Ausführung des Programms anzeigt.
F # 2) Was sind die Kommentare in C ++?
Antworten: Kommentare in C ++ sind einfach ein Teil des Quellcodes, der vom Compiler ignoriert wird. Sie sind nur für Programmierer hilfreich, um eine Beschreibung oder zusätzliche Informationen zu ihrem Quellcode hinzuzufügen.
In C ++ gibt es zwei Möglichkeiten, Kommentare hinzuzufügen:
- // einzeiliger Kommentar
- / * Blockkommentar * /
Der erste Typ verwirft alles, nachdem der Compiler auf '//' gestoßen ist. Beim zweiten Typ verwirft der Compiler alles zwischen '/ *' und '* /'.
Variablen, Datentypen und Konstanten
F # 3) Unterschied zwischen Deklaration und Definition einer Variablen.
Antworten: Die Deklaration einer Variablen gibt lediglich den Datentyp einer Variablen und den Variablennamen an. Als Ergebnis der Deklaration weisen wir den Compiler an, den Speicherplatz für eine Variable im Speicher gemäß dem angegebenen Datentyp zu reservieren.
Beispiel:
int Result; char c; int a,b,c;
Alle oben genannten sind gültige Erklärungen. Beachten Sie außerdem, dass der Wert der Variablen aufgrund der Deklaration unbestimmt ist.
Während eine Definition eine Implementierung / Instanziierung der deklarierten Variablen ist, binden wir einen geeigneten Wert an die deklarierte Variable, damit der Linker Verweise auf die entsprechenden Entitäten verknüpfen kann.
Aus obigem Beispiel ,
Ergebnis = 10;
C = 'A';
Dies sind gültige Definitionen.
F # 4) Kommentar zum lokalen und globalen Bereich einer Variablen.
Antworten: Der Umfang einer Variablen ist definiert als der Umfang des Programmcodes, in dem die Variable aktiv bleibt, d. H. Sie kann deklariert, definiert oder bearbeitet werden.
In C ++ gibt es zwei Arten von Gültigkeitsbereichen:
- Lokaler Geltungsbereich: Eine Variable hat einen lokalen Gültigkeitsbereich oder ist lokal, wenn sie in einem Codeblock deklariert wird. Die Variable bleibt nur innerhalb des Blocks aktiv und ist außerhalb des Codeblocks nicht zugänglich.
- Globaler Geltungsbereich: Eine Variable hat einen globalen Bereich, wenn sie im gesamten Programm verfügbar ist. Vor allen Funktionsdefinitionen wird über dem Programm eine globale Variable deklariert.
Beispiel:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
F # 5) Welche Priorität hat es, wenn das Programm eine globale und eine lokale Variable mit demselben Namen enthält?
Antworten: Immer wenn es eine lokale Variable mit demselben Namen wie eine globale Variable gibt, gibt der Compiler der lokalen Variablen Vorrang.
Beispiel:
#include int globalVar = 2; int main() { int globalVar = 5; cout<Die Ausgabe des obigen Codes ist 5. Dies liegt daran, dass der Compiler dem lokalen Bereich den Vorzug gegeben hat, obwohl beide Variablen denselben Namen haben.
F # 6) Wie werden Sie auf die globale Variable zugreifen, wenn es eine globale Variable und eine lokale Variable mit demselben Namen gibt?
Antworten: Wenn es zwei Variablen mit demselben Namen, aber unterschiedlichem Gültigkeitsbereich gibt, d. H. Eine ist eine lokale Variable und die andere eine globale Variable, bevorzugt der Compiler eine lokale Variable.
Um auf die globale Variable zugreifen zu können, verwenden wir ein „ Scope Resolution Operator (: :) ”. Mit diesem Operator können wir auf den Wert der globalen Variablen zugreifen.
Beispiel:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Ausgabe:
Globale Variable x = 10
lokale Variable x = 2
F # 7) Wie viele Möglichkeiten gibt es, ein int mit einer Konstanten zu initialisieren?
Antworten: Es gibt zwei Möglichkeiten:
- Das erste Format verwendet die traditionelle C-Notation.
int result = 10; - Das zweite Format verwendet die Konstruktornotation.
int Ergebnis (10);
Konstanten
F # 8) Was ist eine Konstante? Erklären Sie mit einem Beispiel.
Antworten: Eine Konstante ist ein Ausdruck mit einem festen Wert. Sie können je nach Datentyp in Ganzzahl-, Dezimal-, Gleitkomma-, Zeichen- oder Zeichenfolgenkonstanten unterteilt werden.
Abgesehen von der Dezimalzahl unterstützt C ++ auch zwei weitere Konstanten, d. H. Oktale (zur Basis 8) und hexadezimale (zur Basis 16) Konstanten.
Beispiele für Konstanten:
- 75 // Ganzzahl (dezimal)
- 0113 // oktal
- 0x4b // hexadezimal
- 3.142 // Gleitkomma
- 'C' // Zeichenkonstante
- 'Hallo Welt' // String-Konstante
Hinweis: Wenn wir ein einzelnes Zeichen darstellen müssen, verwenden wir einfache Anführungszeichen, und wenn wir eine Konstante mit mehr als einem Zeichen definieren möchten, verwenden wir doppelte Anführungszeichen.
F # 9) Wie definieren / deklarieren Sie Konstanten in C ++?
Antworten: In C ++ können wir unsere eigenen Konstanten mit dem definieren #definieren Präprozessor-Direktive.
#define Identifier value
Beispiel:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Ausgabe: Kreisfläche = 78,55
Wie im obigen Beispiel gezeigt, können wir eine Konstante, sobald wir sie mit der Direktive #define definiert haben, im gesamten Programm verwenden und ihren Wert ersetzen.
Wir können Konstanten in C ++ mit dem “deklarieren const ' Stichwort. Diese Methode ähnelt der Deklaration einer Variablen, jedoch mit einem const-Präfix.
Beispiele für die Deklaration einer Konstante
const int pi = 3,142;
const char c = 'etw';
const Postleitzahl = 411014;
In den obigen Beispielen verwendet der C ++ - Compiler standardmäßig einen ganzzahligen Typ, wenn der Typ einer Konstante nicht angegeben ist.
Betreiber
F # 10) Kommentar zum Zuweisungsoperator in C ++.
Antworten: Der Zuweisungsoperator in C ++ wird verwendet, um einer anderen Variablen einen Wert zuzuweisen.
a = 5;
Diese Codezeile weist den ganzzahligen Wert zu 5 zu variabel zu .
Der Teil links vom Operator = wird als bezeichnet lWert (linker Wert) und der rechte als rWert (richtiger Wert). L. Wert muss immer eine Variable sein, während die rechte Seite eine Konstante, eine Variable, das Ergebnis einer Operation oder eine beliebige Kombination davon sein kann.
Die Zuweisungsoperation findet immer von rechts nach links und niemals umgekehrt statt.
Eine Eigenschaft, die C ++ gegenüber den anderen Programmiersprachen hat, ist, dass der Zuweisungsoperator als verwendet werden kann rWert (oder Teil eines rWert ) für eine andere Aufgabe.
Beispiel:
a = 2 + (b = 5);
ist äquivalent zu:
b = 5;
a = 2 + b;
Was bedeutet, zuerst zuweisen 5 zu variabel b und dann zuweisen zu, der Wert zwei plus das Ergebnis des vorherigen Ausdrucks von b (das ist 5), geht zu mit einem Endwert von 7 .
Daher ist der folgende Ausdruck auch in C ++ gültig:
a = b = c = 5;
Weisen Sie Variablen 5 zu zu , b und c .
F # 11) Was ist der Unterschied zwischen gleich (==) und Zuweisungsoperator (=)?
Antworten: In C ++ sind gleich (==) und Zuweisungsoperator (=) zwei völlig unterschiedliche Operatoren.
Equal to (==) ist ein relationaler Gleichheitsoperator, der zwei Ausdrücke auswertet, um festzustellen, ob sie gleich sind, und true zurückgibt, wenn sie gleich sind, und false, wenn sie nicht gleich sind.
Der Zuweisungsoperator (=) wird verwendet, um einer Variablen einen Wert zuzuweisen. Daher können wir eine komplexe Zuweisungsoperation innerhalb des relationalen Gleichheitsoperators zur Bewertung haben.
F # 12) Was sind die verschiedenen arithmetischen Operatoren in C ++?
Antwort: C ++ unterstützt die folgenden arithmetischen Operatoren:
- + zusätzlich
- - Subtraktion
- * Multiplikation
- / Teilung
- % Modul
Lassen Sie uns die verschiedenen arithmetischen Operatoren mit dem folgenden Code demonstrieren.
Beispiel:
#include int main () { int a=5, b=3; cout<<”a + b = “< Ausgabe ::
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Wie oben gezeigt, sind alle anderen Operationen unkompliziert und mit den tatsächlichen arithmetischen Operationen identisch, mit Ausnahme des Modulo-Operators, der ganz anders ist. Der Modulo-Operator teilt a und b und das Ergebnis der Operation ist der Rest der Division.
F # 13) Was sind die verschiedenen zusammengesetzten Zuweisungsoperatoren in C ++?
Antworten: Im Folgenden sind die zusammengesetzten Zuweisungsoperatoren in C ++ aufgeführt:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
Der zusammengesetzte Zuweisungsoperator ist eine der wichtigsten Funktionen der C ++ - Sprache, mit der wir den Wert einer Variablen mit einem der grundlegenden Operatoren ändern können:
Beispiel:
value += increase; is equivalent to value = value + increase; if base_salary is a variable of type int. int base_salary = 1000; base_salary += 1000; #base_salary = base_salary + 1000 base_salary *= 5; #base_salary = base_salary * 5;
F # 14) Geben Sie den Unterschied zwischen Vor- und Nachinkrementierungs- / Dekrementierungsvorgängen an.
Antworten: C ++ erlaubt zwei Operatoren, d. H. ++ (Inkrement) und - (Dekrement), mit denen Sie 1 zum vorhandenen Wert einer Variablen addieren und 1 von der Variablen subtrahieren können. Diese Operatoren werden wiederum als Inkrement (++) und Dekrement (-) bezeichnet.
Beispiel:
a = 5;
a ++;
Die zweite Anweisung, a ++, bewirkt, dass 1 zum Wert von a hinzugefügt wird. Somit entspricht ein ++
a = a + 1; oder
a + = 1;
Ein einzigartiges Merkmal dieser Operatoren ist, dass wir diesen Operatoren die Variable voranstellen oder ein Suffix hinzufügen können. Wenn also a eine Variable ist und wir dem Inkrementoperator ein Präfix voranstellen, wird dies der Fall sein
++ a;
Dies wird als Vorinkrement bezeichnet. In ähnlicher Weise haben wir auch eine Vordekrementierung.
Wenn wir der Variablen a einen Inkrementoperator voranstellen, haben wir:
a ++;
Dies ist das Nachinkrement. Ebenso haben wir auch Nachdekrementierung.
Der Unterschied zwischen der Bedeutung von Pre und Post hängt davon ab, wie der Ausdruck bewertet und das Ergebnis gespeichert wird.
Im Fall des Vorinkrementierungs- / Dekrementierungsoperators wird zuerst die Inkrementierungs- / Dekrementierungsoperation ausgeführt und dann das Ergebnis an einen Wert übergeben. Während für Operationen nach dem Inkrementieren / Dekrementieren der l-Wert zuerst ausgewertet wird und dann das Inkrementieren / Dekrementieren entsprechend durchgeführt wird.
Beispiel:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
-ein; # a = 5
b ++; # 6
E / A über die Konsole
F # 15) Was sind die Extraktions- und Einfügeoperatoren in C ++? Erklären Sie mit Beispielen.
Antworten: In der iostream.h-Bibliothek von C ++ China , und Kosten sind die beiden Datenströme, die für die Eingabe bzw. Ausgabe verwendet werden. Cout wird normalerweise auf den Bildschirm gerichtet und Cin wird der Tastatur zugewiesen.
'Cin' (Extraktionsoperator): Durch die Verwendung des überladenen Operators >> mit cin stream verarbeitet C ++ die Standardeingabe.
int age; cin>>age;
Wie im obigen Beispiel gezeigt, wird eine ganzzahlige Variable 'age' deklariert und wartet darauf, dass cin (Tastatur) die Daten eingibt. 'Cin' verarbeitet die Eingabe nur, wenn die RETURN-Taste gedrückt wird.
'Cout' (Einfügeoperator): Dies wird in Verbindung mit der Überlastung verwendet<< operator. It directs the data that followed it into the cout stream.
Beispiel:
qa Fragen und Antworten zu Automatisierungsinterviews
cout<<”Hello, World!”; cout<<123;
Kontrollstrukturen und Funktionen
Kontrollstrukturen und Schleifen
F # 16) Was ist der Unterschied zwischen while- und do while-Schleife? Erklären Sie mit Beispielen.
Antworten: Das Format der while-Schleife in C ++ lautet:
Während (Ausdruck)
{Anweisungen;}
Der Anweisungsblock unter while wird ausgeführt, solange die Bedingung im angegebenen Ausdruck erfüllt ist.
Beispiel:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<Im obigen Code wird die Schleife direkt beendet, wenn n 0 ist. Somit befindet sich in der while-Schleife die Abschlussbedingung am Anfang der Schleife, und wenn sie erfüllt ist, werden keine Iterationen der Schleife ausgeführt.
Als nächstes betrachten wir die do-while-Schleife.
Das allgemeine Format von do-while lautet:
do {Anweisung;} while (Bedingung);
Beispiel:
#include int main() { int n; cout<>n; do { cout<Im obigen Code können wir sehen, dass die Anweisung innerhalb der Schleife mindestens einmal ausgeführt wird, da die Schleifenbedingung am Ende ist. Dies sind die Hauptunterschiede zwischen while und do-while.
Im Falle der while-Schleife können wir die Schleife am Anfang direkt verlassen, wenn die Bedingung nicht erfüllt ist, während wir in der do-while-Schleife die Schleifenanweisungen mindestens einmal ausführen.
Funktionen
F # 17) Was meinen Sie mit dem Rückgabetyp 'ungültig'?
Antworten: Alle Funktionen sollten einen Wert gemäß der allgemeinen Syntax zurückgeben.
Wenn wir jedoch nicht möchten, dass eine Funktion einen Wert zurückgibt, verwenden wir „ Leere ”, Um das anzuzeigen. Das heißt, wir verwenden “ Leere 'Um anzuzeigen, dass die Funktion keinen Rückgabewert hat oder' Leere ”.
Beispiel:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
F # 18) Erklären Sie Pass by Value und Pass by Reference.
Antworten: Während wir Parameter mit „Übergeben nach Wert“ an die Funktion übergeben, übergeben wir eine Kopie der Parameter an die Funktion.
Daher werden alle Änderungen, die an den Parametern in der aufgerufenen Funktion vorgenommen werden, nicht an die aufrufende Funktion zurückgegeben. Somit bleiben die Variablen in der aufrufenden Funktion unverändert.
Beispiel:
void printFunc(int a,int b,int c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Ausgabe:
x = 1
y = 3
z = 4
Wie oben gezeigt, wurden die Parameter, obwohl sie in der aufgerufenen Funktion geändert wurden, nicht in der aufrufenden Funktion wiedergegeben, da sie als Wert übergeben wurden.
Wenn wir jedoch die geänderten Werte von der Funktion zurück in die aufrufende Funktion bringen möchten, verwenden wir die Technik „Pass by Reference“.
Um dies zu demonstrieren, modifizieren wir das obige Programm wie folgt:
void printFunc(int& a,int& b,int& c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Ausgabe:
x = 2
y = 6
z = 8
Wie oben gezeigt, werden die an den Parametern in den aufgerufenen Funktionen vorgenommenen Änderungen an die aufrufende Funktion übergeben, wenn die Technik 'Referenzübergabe' verwendet wird. Dies liegt daran, dass wir mit dieser Technik keine Kopie der Parameter übergeben, sondern die Referenz der Variablen selbst übergeben.
F # 19) Was sind Standardparameter? Wie werden sie in der C ++ - Funktion ausgewertet?
Antworten: Standardparameter ist ein Wert, der jedem Parameter beim Deklarieren einer Funktion zugewiesen wird.
Dieser Wert wird verwendet, wenn dieser Parameter beim Aufrufen der Funktion leer gelassen wird. Um einen Standardwert für einen bestimmten Parameter anzugeben, weisen wir dem Parameter in der Funktionsdeklaration einfach einen Wert zu.
Wenn der Wert für diesen Parameter während des Funktionsaufrufs nicht übergeben wird, verwendet der Compiler den angegebenen Standardwert. Wenn ein Wert angegeben wird, wird dieser Standardwert aktiviert und der übergebene Wert verwendet.
Beispiel:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Ausgabe:
12
6
Wie im obigen Code gezeigt, gibt es zwei Aufrufe zum Multiplizieren der Funktion. Beim ersten Aufruf wird nur ein Parameter mit einem Wert übergeben. In diesem Fall ist der zweite Parameter der angegebene Standardwert. Beim zweiten Aufruf wird jedoch der Standardwert überschrieben und der übergebene Wert verwendet, da beide Parameterwerte übergeben werden.
F # 20) Was ist eine Inline-Funktion in C ++?
Antworten: Die Inline-Funktion ist eine Funktion, die vom Compiler als Aufrufpunkt der Funktion kompiliert wird und an deren Stelle der Code ersetzt wird. Dies beschleunigt das Kompilieren. Diese Funktion wird definiert, indem dem Funktionsprototyp das Schlüsselwort 'inline' vorangestellt wird.
Solche Funktionen sind nur dann vorteilhaft, wenn der Code der Inline-Funktion klein und einfach ist. Obwohl eine Funktion als Inline definiert ist, ist es vollständig vom Compiler abhängig, sie als Inline auszuwerten oder nicht.
Erweiterte Datenstruktur
Arrays
F # 21) Warum werden Arrays normalerweise mit for-Schleife verarbeitet?
Antworten: Array verwendet den Index, um jedes seiner Elemente zu durchlaufen.
Wenn A ein Array ist, wird auf jedes seiner Elemente als A (i) zugegriffen. Programmatisch ist dazu lediglich ein iterativer Block mit einer Schleifenvariablen i erforderlich, die als Index (Zähler) dient, der von 0 auf A. Länge-1 erhöht wird.
Dies ist genau das, was eine Schleife tut, und dies ist der Grund, warum wir Arrays mit for-Schleifen verarbeiten.
Q # 22) Geben Sie den Unterschied zwischen Löschen und Löschen () an.
Antworten: 'Delete ()' wird verwendet, um den einem Array zugewiesenen Speicher freizugeben, der mit new () zugewiesen wurde. 'Löschen' wird verwendet, um einen Teil des Speichers freizugeben, der mit new zugewiesen wurde.
F # 23) Was ist mit diesem Code falsch?
T * p = neues T (10);
lösche p;
Antworten: Der obige Code ist syntaktisch korrekt und wird gut kompiliert.
Das einzige Problem ist, dass nur das erste Element des Arrays gelöscht wird. Obwohl das gesamte Array gelöscht wird, wird nur der Destruktor des ersten Elements aufgerufen und der Speicher für das erste Element freigegeben.
F # 24) In welcher Reihenfolge werden die Objekte in einem Array zerstört?
Antworten: Objekte in einem Array werden in umgekehrter Reihenfolge zerstört: Zuerst konstruiert, zuletzt zerstört.
Im folgenden Beispiel, Die Reihenfolge für Destruktoren lautet a (9), a (8),…, a (1), a (0):
voiduserCode() { Car a(10); ... }
Zeiger
F # 25) Was ist mit diesem Code falsch?
T * p = 0;
lösche p;
Antworten: Im obigen Code ist der Zeiger ein Nullzeiger. Gemäß dem C ++ 03-Standard ist es vollkommen gültig, delete für einen NULL-Zeiger aufzurufen. Der Löschoperator würde sich intern um die NULL-Prüfung kümmern.
F # 26) Was ist eine Referenzvariable in C ++?
Antworten: Eine Referenzvariable ist ein Aliasname für die vorhandene Variable. Dies bedeutet, dass sowohl der Variablenname als auch die Referenzvariable auf denselben Speicherort verweisen. Daher wird bei jeder Aktualisierung der Variablen auch die Referenz aktualisiert.
Beispiel:
int a=10; int& b = a;
Hier ist b die Referenz von a.
Speicherklassen
F # 27) Was ist eine Speicherklasse? Erwähnen Sie die Speicherklassen in C ++.
Antworten: Die Speicherklasse bestimmt die Lebensdauer oder den Umfang von Symbolen wie Variablen oder Funktionen.
C ++ unterstützt die folgenden Speicherklassen:
- Auto
- Statisch
- Extern
- Registrieren
- Veränderlich
F # 28) Erklären Sie den Spezifizierer der Mutable Storage-Klasse.
Antworten: Die Variable des Mitglieds eines konstanten Klassenobjekts kann nicht geändert werden. Indem wir die Variablen jedoch als 'veränderlich' deklarieren, können wir die Werte dieser Variablen ändern.
F # 29) Wofür ist das Schlüsselwort auto?
Antworten: Standardmäßig ist jede lokale Variable der Funktion automatisch, d.h. Auto . In der folgenden Funktion sind die Variablen 'i' und 'j' automatische Variablen.
void f() { int i; auto int j; }
HINWEIS : Eine globale Variable ist keine automatische Variable.
F # 30) Was ist eine statische Variable?
Antworten: Eine statische Variable ist eine lokale Variable, die ihren Wert über die Funktionsaufrufe hinweg beibehält. Statische Variablen werden mit dem Schlüsselwort 'static' deklariert. Numerische Variablen, die statisch sind, haben den Standardwert Null.
Die folgende Funktion gibt 1 2 3 aus, wenn sie dreimal aufgerufen wird.
void f() { static int i; ++i; printf(“%d “,i); }
Wenn eine globale Variable statisch ist, ist ihre Sichtbarkeit auf denselben Quellcode beschränkt.
F # 31) Was ist der Zweck des externen Speicherspezifizierers?
Antworten: Der Bezeichner 'Extern' wird verwendet, um den Bereich eines globalen Symbols aufzulösen.
#include using nam espace std; main() { extern int i; cout< Im obigen Code kann 'i' außerhalb der Datei sichtbar sein, in der es definiert ist.
F # 32) Erklären Sie den Registerspeicher-Spezifizierer.
Antworten: Die Variable 'Register' sollte immer dann verwendet werden, wenn die Variable verwendet wird. Wenn eine Variable mit einem 'Register' -Spezifizierer deklariert wird, gibt der Compiler ein CPU-Register für seinen Speicher an, um die Suche nach der Variablen zu beschleunigen.
F # 33) Wann werden 'const' -Referenzargumente in einer Funktion verwendet?
Antworten: Die Verwendung von 'const' -Referenzargumenten in einer Funktion ist in mehrfacher Hinsicht vorteilhaft:
- 'Const' schützt vor Programmierfehlern, die Daten verändern könnten.
- Durch die Verwendung von 'const' kann die Funktion sowohl konstante als auch nicht konstante tatsächliche Argumente verarbeiten, was nicht möglich ist, wenn 'const' nicht verwendet wird.
- Durch die Verwendung einer const-Referenz kann die Funktion eine temporäre Variable in geeigneter Weise generieren und verwenden.
Struktur & benutzerdefinierte Datentypen
F # 34) Was ist eine Klasse?
Was sollten Sie bei der Fehlerbehebung bei einem Live-Netzwerkkabel verwenden?
Antworten: Klasse ist ein benutzerdefinierter Datentyp in C ++. Es kann erstellt werden, um eine bestimmte Art von Problem zu lösen. Nach der Erstellung muss der Benutzer die Details der Arbeitsweise einer Klasse nicht kennen.
Im Allgemeinen fungiert die Klasse als Blaupause eines Projekts und kann verschiedene Parameter und Funktionen oder Aktionen enthalten, die mit diesen Parametern arbeiten. Diese werden als Mitglieder der Klasse bezeichnet.
F # 35) Unterschied zwischen Klasse und Struktur.
Antworten:
Struktur: In der Sprache C wird die Struktur verwendet, um verschiedene Arten von Datentypen zu bündeln. Die Variablen innerhalb einer Struktur werden als Mitglieder der Struktur bezeichnet. Diese Mitglieder sind standardmäßig öffentlich und können mithilfe des Strukturnamens gefolgt von einem Punktoperator und dem Mitgliedsnamen aufgerufen werden.
Klasse: Klasse ist ein Nachfolger der Struktur. C ++ erweitert die Strukturdefinition um die Funktionen, die für seine Mitglieder ausgeführt werden. Standardmäßig sind alle Mitglieder in der Klasse privat.
Objektorientierte Programmierung mit C ++
Klassen, Konstruktoren, Destruktoren
F # 36) Was ist ein Namespace?
Antworten: Mit dem Namespace können wir eine Reihe globaler Klassen, Objekte und / oder Funktionen unter einem bestimmten Namen gruppieren.
Die allgemeine Form zur Verwendung von Namespaces lautet:
Namespace-ID {Namespace-Body}
Dabei ist bezeichner ein gültiger Bezeichner und der Namespace-Body die Menge von Klassen, Objekten und Funktionen, die im Namespace enthalten sind. Namespaces sind besonders nützlich, wenn mehr als ein Objekt denselben Namen haben kann, was zu Namenskonflikten führt.
F # 37) Was nützt die Verwendung der Deklaration?
Antworten: Die Verwendung der Deklaration wird verwendet, um einen Namen aus dem Namespace ohne den Bereichsauflösungsoperator zu referenzieren.
F # 38) Was ist Name Mangling?
Antworten: Der C ++ - Compiler codiert die Parametertypen mit Funktion / Methode in einen eindeutigen Namen. Dieser Vorgang wird als Namensmangel bezeichnet. Der umgekehrte Prozess wird als Entwirrung bezeichnet.
Beispiel:
A :: b (int, long) const ist verstümmelt als 'B__C3Ail' .
Bei einem Konstruktor wird der Methodenname weggelassen.
Das ist A :: A (int, long) const ist verstümmelt als 'C3Ail'.
F # 39) Was ist der Unterschied zwischen einem Objekt und einer Klasse?
Antworten: Klasse ist eine Blaupause eines zu lösenden Projekts oder Problems und besteht aus Variablen und Methoden. Diese werden als Mitglieder der Klasse bezeichnet. Wir können nicht alleine auf Methoden oder Variablen der Klasse zugreifen, es sei denn, sie sind als statisch deklariert.
Um auf die Klassenmitglieder zuzugreifen und sie zu verwenden, sollten wir eine Instanz einer Klasse erstellen, die als Objekt bezeichnet wird. Die Klasse hat eine unbegrenzte Lebensdauer, während ein Objekt nur eine begrenzte Lebensdauer hat.
F # 40) Was sind die verschiedenen Zugriffsspezifizierer in C ++?
Antworten: C ++ unterstützt die folgenden Zugriffsspezifizierer:
- Öffentlichkeit: Auf Datenelemente und Funktionen kann außerhalb der Klasse zugegriffen werden.
- Privat: Auf Datenelemente und Funktionen kann außerhalb der Klasse nicht zugegriffen werden. Die Ausnahme ist die Verwendung einer Freundesklasse.
- Geschützt: Datenelemente und Funktionen sind nur für die abgeleiteten Klassen zugänglich.
Beispiel:
Beschreiben Sie PRIVATE, PROTECTED und PUBLIC mit ihren Unterschieden und geben Sie Beispiele.
class A{ int x; int y; public int a; protected bool flag; public A() : x(0) , y(0) {} //default (no argument) constructor }; main(){ A MyObj; MyObj.x = 5; // Compiler will issue a ERROR as x is private int x = MyObj.x; // Compiler will issue a compile ERROR MyObj.x is private MyObj.a = 10; // no problem; a is public member int col = MyObj.a; // no problem MyObj.flag = true; // Compiler will issue a ERROR; protected values are read only bool isFlag = MyObj.flag; // no problem
F # 41) Was ist ein Konstruktor und wie heißt er?
Antworten: Der Konstruktor ist eine Mitgliedsfunktion der Klasse mit demselben Namen wie die Klasse. Es wird hauptsächlich zum Initialisieren der Mitglieder der Klasse verwendet. Standardmäßig sind Konstruktoren öffentlich.
Es gibt zwei Möglichkeiten, wie die Konstruktoren aufgerufen werden:
- Implizit: Konstruktoren werden vom Compiler implizit aufgerufen, wenn ein Objekt der Klasse erstellt wird. Dadurch wird ein Objekt auf einem Stapel erstellt.
- Explizites Anrufen: Wenn das Objekt einer Klasse mit new erstellt wird, werden Konstruktoren explizit aufgerufen. Dadurch wird normalerweise ein Objekt auf einem Heap erstellt.
Beispiel:
class A{ int x; int y; public A() : x(0) , y(0) {} //default (no argument) constructor }; main() { A Myobj; // Implicit Constructor call. In order to allocate memory on stack, //the default constructor is implicitly called. A * pPoint = new A(); // Explicit Constructor call. In order to allocate //memory on HEAP we call the default constructor. }
F # 42) Was ist ein COPY CONSTRUCTOR und wann heißt er?
Antworten: Ein Kopierkonstruktor ist ein Konstruktor, der ein Objekt derselben Klasse wie sein Parameter akzeptiert und seine Datenelemente in das Objekt im linken Teil der Zuweisung kopiert. Dies ist nützlich, wenn wir ein neues Objekt derselben Klasse erstellen müssen.
Beispiel:
class A{ int x; int y; public int color; public A() : x(0) , y(0) {} //default (no argument) constructor public A( const A& ) ; }; A::A( const A & p ) { this->x = p.x; this->y = p.y; this->color = p.color; } main() { A Myobj; Myobj.color = 345; A Anotherobj = A( Myobj ); // now Anotherobj has color = 345 }
F # 43) Was ist ein Standardkonstruktor?
Antworten: Der Standardkonstruktor ist ein Konstruktor, der entweder keine Argumente hat oder, falls vorhanden, alle Standardargumente sind.
Beispiel:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
F # 44) Was ist ein Konvertierungskonstruktor?
Antworten: Es ist ein Konstruktor, der ein Argument eines anderen Typs akzeptiert. Konvertierungskonstruktoren werden hauptsächlich zum Konvertieren von einem Typ in einen anderen verwendet.
F # 45) Was ist ein expliziter Konstruktor?
Antworten: Ein Konvertierungskonstruktor wird mit dem expliziten Schlüsselwort deklariert. Der Compiler verwendet keinen expliziten Konstruktor, um eine implizite Konvertierung von Typen zu implementieren. Sein Zweck ist ausdrücklich dem Bau vorbehalten.
F # 46) Welche Rolle spielt das statische Schlüsselwort für eine Klassenmitgliedsvariable?
Antworten: Die statische Elementvariable teilt einen gemeinsamen Speicher für alle Objekte, die für die jeweilige Klasse erstellt wurden. Wir müssen nicht mit einem Objekt auf die statische Elementvariable verweisen. Der Zugriff kann jedoch über den Klassennamen selbst erfolgen.
F # 47) Erläutern Sie die statische Elementfunktion.
Antworten: Eine statische Elementfunktion kann nur auf die statische Elementvariable der Klasse zugreifen. Wie bei den statischen Elementvariablen kann auch über den Klassennamen auf eine statische Elementfunktion zugegriffen werden.
F # 48) In welcher Reihenfolge werden die lokalen Objekte zerstört?
Antwort: Befolgen Sie einen Code:
Class A{ …. }; int main() { A a; A b; ... }
In der Hauptfunktion haben wir zwei Objekte nacheinander erstellt. Sie werden in der Reihenfolge erstellt, zuerst a, dann b. Wenn diese Objekte jedoch gelöscht werden oder den Gültigkeitsbereich verlassen, wird der Destruktor für jedes Objekt in der umgekehrten Reihenfolge aufgerufen, in der sie erstellt wurden.
Daher wird der Destruktor von b zuerst aufgerufen, gefolgt von a. Selbst wenn wir eine Reihe von Objekten haben, werden sie in der umgekehrten Reihenfolge ihrer Erstellung auf dieselbe Weise zerstört.
Überlastung
F # 49) Erklären Sie das Überladen von Funktionen und das Überladen von Bedienern.
Antworten: C ++ unterstützt das OOP-Konzept Polymorphismus, was „viele Formen“ bedeutet.
In C ++ gibt es zwei Arten von Polymorphismus, d. H. Kompilierzeitpolymorphismus und Laufzeitpolymorphismus. Der Polymorphismus zur Kompilierungszeit wird unter Verwendung einer Überladungstechnik erreicht. Überladen bedeutet einfach, einer Entität eine zusätzliche Bedeutung zu geben, indem ihre Basisbedeutung intakt bleibt.
C ++ unterstützt zwei Arten der Überladung:
Funktionsüberladung:
Das Überladen von Funktionen ist eine Technik, mit der der Programmierer mehr als eine Funktion mit demselben Namen, aber unterschiedlicher Parameterliste haben kann. Mit anderen Worten, wir überladen die Funktion mit verschiedenen Argumenten, d. H. Der Art der Argumente, der Anzahl der Argumente oder der Reihenfolge der Argumente.
Eine Funktionsüberladung wird bei ihrem Rückgabetyp niemals erreicht.
Überlastung des Bedieners:
Dies ist eine weitere Art von Polymorphismus zur Kompilierungszeit, der von C ++ unterstützt wird. Beim Überladen von Operatoren wird ein Operator überladen, sodass er auch mit den Operanden des Standarddatentyps mit den benutzerdefinierten Typen arbeiten kann. Dabei bleibt jedoch die Standarddefinition dieses Operators erhalten.
Zum Beispiel, Ein Additionsoperator (+), der mit numerischen Datentypen arbeitet, kann überladen werden, um zwei Objekte wie ein Objekt mit komplexer Zahlenklasse zu bearbeiten.
F # 50) Was ist der Unterschied zwischen Methodenüberladung und Methodenüberschreibung in C ++?
Antworten: Das Überladen von Methoden hat Funktionen mit demselben Namen, aber unterschiedlichen Argumentlisten. Dies ist eine Form des Polymorphismus zur Kompilierungszeit.
Das Überschreiben von Methoden wird sichtbar, wenn wir die von einer Basisklasse abgeleitete Methode neu schreiben. Das Überschreiben von Methoden wird verwendet, wenn Laufzeitpolymorphismus oder virtuelle Funktionen behandelt werden.
F # 51) Was ist der Unterschied zwischen einem Kopierkonstruktor und einem überladenen Aufgabenverwalter?
Antworten: Ein Kopierkonstruktor und ein überladener Zuweisungsoperator dienen im Wesentlichen demselben Zweck, d. H. Dem Zuweisen des Inhalts eines Objekts zu einem anderen. Trotzdem gibt es einen Unterschied zwischen den beiden.
Beispiel:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
Im obigen Beispiel ist die zweite Anweisung c1 = c2 eine überladene Zuweisungsanweisung.
Hier sind sowohl c1 als auch c2 bereits vorhandene Objekte und der Inhalt von c2 wird dem Objekt c1 zugewiesen. Für eine überladene Zuweisungsanweisung müssen daher beide Objekte bereits erstellt werden.
Die nächste Anweisung, komplex c3 = c2, ist ein Beispiel für den Kopierkonstruktor. Hier wird der Inhalt von c2 einem neuen Objekt c3 zugewiesen, was bedeutet, dass der Kopierkonstruktor bei jeder Ausführung ein neues Objekt erstellt.
F # 52) Nennen Sie die Operatoren, die nicht überladen werden können.
Antworten:
- sizeof - sizeof operator
- . - Punktoperator
- . * - Dereferenzierungsoperator
- -> - Mitglied-Dereferenzierungsoperator
- :: - Scope Resolution Operator
- ?: - Bedingter Operator
Q # 53) Die Funktion kann basierend auf dem Parameter, der ein Wert oder eine Referenz ist, überladen werden. Erklären Sie, ob die Aussage wahr ist.
Antworten: Falsch. Sowohl die Übergabe als Wert als auch die Übergabe als Referenz sehen für den Anrufer identisch aus.
F # 54) Was sind die Vorteile von Operator Overloading?
Antworten: Durch Überladen von Standardoperatoren für eine Klasse können wir die Bedeutung dieser Operatoren erweitern, sodass sie auch für andere benutzerdefinierte Objekte ausgeführt werden können.
Durch das Überladen von Funktionen können wir die Komplexität des Codes reduzieren und ihn klarer und lesbarer machen, da wir dieselben Funktionsnamen mit unterschiedlichen Argumentlisten haben können.
Erbe
F # 55) Was ist Vererbung?
Antworten: Vererbung ist ein Prozess, mit dem wir die Merkmale einer vorhandenen Entität erfassen und eine neue Entität bilden können, indem wir ihr weitere Funktionen hinzufügen.
In Bezug auf C ++ erstellt die Vererbung eine neue Klasse, indem sie von einer vorhandenen Klasse abgeleitet wird, sodass diese neue Klasse sowohl die Eigenschaften ihrer übergeordneten als auch ihrer eigenen Klasse hat.
F # 56) Was sind die Vorteile der Vererbung?
Antworten: Die Vererbung ermöglicht die Wiederverwendbarkeit von Code und spart so Zeit bei der Codeentwicklung.
Durch das Erben verwenden wir eine fehlerfreie, qualitativ hochwertige Software, die zukünftige Probleme reduziert.
F # 57) Unterstützt C ++ mehrstufige und mehrfache Vererbungen?
Antworten: Ja.
F # 58) Was sind Mehrfachvererbungen (virtuelle Vererbung)? Was sind ihre Vor- und Nachteile?
Antworten: Bei mehreren Vererbungen haben wir mehr als eine Basisklasse, von der eine abgeleitete Klasse erben kann. Daher nimmt eine abgeleitete Klasse die Merkmale und Eigenschaften von mehr als einer Basisklasse an.
Zum Beispiel , eine Klasse Treiber wird nämlich zwei Basisklassen haben, Mitarbeiter und eine Person, weil ein Fahrer sowohl ein Angestellter als auch eine Person ist. Dies ist vorteilhaft, da die Treiberklasse sowohl die Eigenschaften des Mitarbeiters als auch der Personenklasse erben kann.
Im Fall eines Mitarbeiters und einer Person hat die Klasse jedoch einige Eigenschaften gemeinsam. Es tritt jedoch eine mehrdeutige Situation auf, da die Treiberklasse nicht weiß, von welchen Klassen die gemeinsamen Eigenschaften geerbt werden sollen. Dies ist der Hauptnachteil von Mehrfachvererbungen.
F # 59) Erläutern Sie die ISA- und HASA-Klassenbeziehungen. Wie würden Sie implementieren jeder?
Antworten: Die 'ISA' -Beziehung weist normalerweise eine Vererbung auf, da dies impliziert, dass eine Klasse 'ISA' -spezialisierte Version einer anderen Klasse. Zum Beispiel , Eine Mitarbeiter-ISA-Person. Das bedeutet, dass eine Employee-Klasse von der Person-Klasse geerbt wird.
Im Gegensatz zu 'ISA' zeigt die 'HASA' -Beziehung, dass eine Entität möglicherweise eine andere Entität als Mitglied hat oder dass in einer Klasse ein anderes Objekt eingebettet ist.
Wenn wir also dasselbe Beispiel einer Employee-Klasse nehmen, ordnen wir die Salary-Klasse dem Mitarbeiter nicht zu, indem wir sie erben, sondern indem wir das Salary-Objekt in die Employee-Klasse aufnehmen oder enthalten. Die Beziehung „HASA“ lässt sich am besten durch Eindämmung oder Aggregation zeigen.
F # 60) Erbt eine abgeleitete Klasse oder erbt sie nicht?
Antworten: Wenn eine abgeleitete Klasse aus einer bestimmten Basisklasse erstellt wird, erbt sie im Grunde alle Features und normalen Mitglieder der Basisklasse. Es gibt jedoch einige Ausnahmen von dieser Regel. Beispielsweise erbt eine abgeleitete Klasse die Konstruktoren und Destruktoren der Basisklasse nicht.
Jede Klasse hat ihre eigenen Konstruktoren und Destruktoren. Die abgeleitete Klasse erbt auch nicht den Zuweisungsoperator der Basisklasse und die Freunde der Klasse. Der Grund dafür ist, dass diese Entitäten für eine bestimmte Klasse spezifisch sind. Wenn eine andere Klasse abgeleitet wird oder wenn sie der Freund dieser Klasse ist, können sie nicht an sie weitergegeben werden.
Polymorphismus
F # 61) Was ist Polymorphismus?
Antworten: Die Grundidee des Polymorphismus liegt in vielen Formen vor. In C ++ gibt es zwei Arten von Polymorphismus:
(i) Polymorphismus zur Kompilierungszeit
Beim Polymorphismus zur Kompilierungszeit erreichen wir viele Formen durch Überladung. Daher haben wir eine Operatorüberladung und eine Funktionsüberladung. (Wir haben dies bereits oben behandelt)
(ii) Laufzeitpolymorphismus
Dies ist der Polymorphismus für Klassen und Objekte. Die allgemeine Idee ist, dass eine Basisklasse von mehreren Klassen geerbt werden kann. Ein Basisklassenzeiger kann auf seine untergeordnete Klasse verweisen, und ein Basisklassenarray kann verschiedene untergeordnete Klassenobjekte speichern.
Dies bedeutet, dass ein Objekt auf denselben Funktionsaufruf unterschiedlich reagiert. Diese Art von Polymorphismus kann einen virtuellen Funktionsmechanismus verwenden.
F # 62) Was sind virtuelle Funktionen?
Antworten: Mit einer virtuellen Funktion können die abgeleiteten Klassen die von der Basisklasse bereitgestellte Implementierung ersetzen.
Immer wenn wir Funktionen mit demselben Namen in der Basisklasse sowie in der abgeleiteten Klasse haben, tritt eine Mehrdeutigkeit auf, wenn wir versuchen, mit einem Basisklassenzeiger auf das untergeordnete Klassenobjekt zuzugreifen. Da wir einen Basisklassenzeiger verwenden, wird als Funktion die gleichnamige Basisklassenfunktion aufgerufen.
Um diese Mehrdeutigkeit zu korrigieren, verwenden wir das Schlüsselwort 'virtual' vor dem Funktionsprototyp in der Basisklasse. Mit anderen Worten, wir machen diese polymorphe Funktion virtuell. Durch die Verwendung einer virtuellen Funktion können wir die Mehrdeutigkeit beseitigen und mithilfe eines Basisklassenzeigers korrekt auf alle untergeordneten Klassenfunktionen zugreifen.
F # 63) Geben Sie ein Beispiel für Laufzeitpolymorphismus / virtuelle Funktionen.
Antworten:
class SHAPE{ public virtual Draw() = 0; //abstract class with a pure virtual method }; class CIRCLE: public SHAPE{ public int r; public Draw() { this->drawCircle(0,0,r); } }; class SQUARE: public SHAPE{ public int a; public Draw() { this->drawSquare(0,0,a,a); } }; int main() { SHAPE shape1*; SHAPE shape2*; CIRCLE c1; SQUARE s1; shape1 = &c1; shape2 = &s1; coutIm obigen Code hat die SHAPE-Klasse eine rein virtuelle Funktion und ist eine abstrakte Klasse (kann nicht instanziiert werden). Jede Klasse wird von SHAPE abgeleitet, das die Draw () - Funktion auf ihre eigene Weise implementiert.
Außerdem ist jede Draw-Funktion virtuell, sodass, wenn wir jedes Mal einen Basisklassenzeiger (SHAPE) mit dem Objekt der abgeleiteten Klassen (Circle und SQUARE) verwenden, entsprechende Draw-Funktionen aufgerufen werden.
F # 64) Was meinst du mit reinen virtuellen Funktionen?
Antworten: Eine Pure Virtual Member-Funktion ist eine Member-Funktion, bei der die Basisklasse die abgeleiteten Klassen zum Überschreiben zwingt. Normalerweise hat diese Mitgliedsfunktion keine Implementierung. Reine virtuelle Funktionen werden mit Null gleichgesetzt.
Beispiel:
class Shape { public: virtual void draw() = 0; };
Eine Basisklasse mit einer rein virtuellen Funktion als Mitglied kann als „abstrakte Klasse“ bezeichnet werden. Diese Klasse kann nicht instanziiert werden und fungiert normalerweise als Blaupause mit mehreren Unterklassen mit weiterer Implementierung.
F # 65) Was sind virtuelle Konstruktoren / Destruktoren?
Antworten:
Virtuelle Destruktoren: Wenn wir einen Basisklassenzeiger verwenden, der auf ein abgeleitetes Klassenobjekt zeigt, und es verwenden, um es zu zerstören, wird der Basisklassendestruktor aufgerufen, anstatt den abgeleiteten Klassendestruktor aufzurufen.
Beispiel:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Wie im obigen Beispiel gezeigt, wird der Destruktor aufgerufen, wenn wir 'Löschen' sagen, aber es ist tatsächlich der Basisklassen-Destruktor. Dies führt zu der Unklarheit, dass der gesamte von b gehaltene Speicher nicht ordnungsgemäß gelöscht wird.
Dieses Problem kann mithilfe des Konzepts „Virtual Destructor“ gelöst werden.
Wir machen den Basisklassenkonstruktor 'virtuell', so dass alle Destruktoren der untergeordneten Klasse auch virtuell werden. Wenn wir das Objekt der Basisklasse löschen, das auf das Objekt der abgeleiteten Klasse zeigt, wird der entsprechende Destruktor aufgerufen Die Objekte werden ordnungsgemäß gelöscht.
Dies wird wie folgt gezeigt:
Selen Interview Fragen und Antworten für erfahrene
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Virtueller Builder : Konstruktoren können nicht virtuell sein. Das Deklarieren eines Konstruktors als virtuelle Funktion ist ein Syntaxfehler.
Freund
F # 66) Was ist eine Freundfunktion?
Antworten: In der C ++ - Klasse kann nicht auf private und geschützte Mitglieder außerhalb der Klasse zugegriffen werden. Diese Regel kann jedoch durch die Verwendung des „ Freund ”Funktion.
Wie der Name selbst schon sagt, ist die Friend-Funktion eine externe Funktion, die ein Freund der Klasse ist. Damit die Friend-Funktion auf die privaten und geschützten Methoden der Klasse zugreifen kann, sollte ein Prototyp der Friend-Funktion mit dem Schlüsselwort „friend“ in der Klasse enthalten sein.
F # 67) Was ist eine Freundesklasse?
Antworten: Friend-Klassen werden verwendet, wenn die Regel für private und geschützte Zugriffsspezifizierer überschrieben werden muss, damit zwei Klassen eng miteinander arbeiten können.
Daher können wir eine Freundesklasse haben, um ein Freund einer anderen Klasse zu sein. Auf diese Weise können Freundklassen private, unzugängliche Dinge so halten, wie sie sind.
Wenn wir auf die interne Implementierung einer Klasse (privates Mitglied) zugreifen müssen, ohne die Details durch Veröffentlichung öffentlich zu machen, entscheiden wir uns für Freundfunktionen.
Erweitertes C ++
Vorlagen
F # 68) Was ist eine Vorlage?
Antworten: Mit Vorlagen können Funktionen erstellt werden, die vom Datentyp unabhängig sind (generisch) und jeden Datentyp als Parameter und Rückgabewert verwenden können, ohne die Funktion mit allen möglichen Datentypen überladen zu müssen. Vorlagen erfüllen nahezu die Funktionalität eines Makros.
Der Prototyp ist einer der folgenden:
Vorlage identifizieren > function_declaration;
Vorlage identifizieren > function_declaration;
Der einzige Unterschied zwischen den beiden Prototypen besteht in der Verwendung der Schlüsselwortklasse oder des Typnamens. Ihre grundlegende Funktionalität, generisch zu sein, bleibt dieselbe.
Ausnahmebehandlung
F # 69) Was ist Ausnahmebehandlung? Unterstützt C ++ die Ausnahmebehandlung?
Antworten: Ja, C ++ unterstützt die Ausnahmebehandlung.
Wir können nicht sicherstellen, dass der Code jederzeit normal ausgeführt wird. Es kann bestimmte Situationen geben, die dazu führen können, dass der von uns geschriebene Code fehlerhaft funktioniert, obwohl er fehlerfrei ist. Diese Fehlfunktion des Codes wird aufgerufen Ausnahme .
Wenn eine Ausnahme aufgetreten ist, muss der Compiler sie auslösen, damit wir wissen, dass eine Ausnahme aufgetreten ist. Wenn eine Ausnahme ausgelöst wurde, muss der Compiler sicherstellen, dass sie ordnungsgemäß behandelt wird, damit der Programmablauf ordnungsgemäß fortgesetzt oder beendet wird. Dies nennt man das Behandlung einer Ausnahme.
Somit haben wir in C ++ drei Schlüsselwörter, d.h. Versuchen , werfen und Fang die in Ausnahmebehandlung sind.
Die allgemeine Syntax für den Ausnahmeblock lautet:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Wie oben gezeigt, wird der Code, der möglicherweise eine Fehlfunktion aufweist, unter den try-Block gestellt. Bei Fehlfunktionen des Codes wird eine Ausnahme ausgelöst. Diese Ausnahme wird dann unter dem Fangblock abgefangen und behandelt, d. H. Es werden geeignete Maßnahmen ergriffen.
F # 70) Kommentar zu C ++ - Standardausnahmen?
Antworten: C ++ unterstützt einige Standardausnahmen, die abgefangen werden können, wenn wir den Code in den try-Block einfügen. Diese Ausnahmen sind Teil der Basisklasse “ std :: exception ”. Diese Klasse ist in der C ++ - Headerdatei definiert.
Einige Beispiele für Ausnahmen, die von dieser Klasse unterstützt werden, sind:
bad_alloc - wird von 'new' geworfen
runtime_error - wird für Laufzeitfehler ausgelöst
bad_typeid - wird nach Typ-ID ausgelöst
Einführung in die Standardvorlagenbibliothek
F # 71) Was ist eine Standardvorlagenbibliothek (STL)? Was sind die verschiedenen Arten von STL-Containern?
Antworten: Eine Standard Template Library (STL) ist eine Bibliothek von Containervorlagen, die vom ANSI-Komitee zur Aufnahme in die Standard-C ++ - Spezifikation genehmigt wurden. Wir haben verschiedene Arten von STL-Containern, je nachdem, wie sie die Elemente speichern.
- Warteschlange, Stapel - Diese sind mit herkömmlichen Warteschlangen und Stapeln identisch und werden als adaptive Container bezeichnet.
- Set, Karte - Dies sind im Grunde genommen Container mit Schlüssel / Wert-Paaren, die assoziativer Natur sind.
- Vektor und - Diese sind sequentieller Natur und haben Ähnlichkeiten mit Arrays.
F # 72) Was ist eine Iterator-Klasse?
Antworten: In C ++ ist eine Containerklasse eine Sammlung verschiedener Objekte.
Wenn wir diese Sammlung von Objekten durchlaufen müssen, können wir dies nicht mit einfachen Indexvariablen tun. Daher haben wir eine spezielle Klasse in STL namens an Iterator Klasse, mit der der Inhalt der Containerklasse schrittweise durchlaufen werden kann.
Die verschiedenen Kategorien von Iteratoren umfassen Eingabe-Iteratoren, Ausgabe-Iteratoren, Vorwärts-Iteratoren, bidirektionale Iteratoren, Direktzugriff usw.
F # 73) Was ist der Unterschied zwischen einem externen Iterator und einem internen Iterator? Beschreiben Sie einen Vorteil des externen Iterators.
Antworten: Ein interner Iterator wird mit Elementfunktionen der Klasse implementiert, die Elemente zum Durchlaufen enthalten.
Ein externer Iterator wird als separate Klasse implementiert, die an das Objekt gebunden werden kann, dessen Elemente durchlaufen werden müssen. Der grundlegende Vorteil eines externen Iterators besteht darin, dass er einfach zu implementieren ist, da er als separate Klasse implementiert wird.
Zweitens können viele Iteratorobjekte gleichzeitig aktiv sein, da es sich um eine andere Klasse handelt.
Weiterführende Literatur => C # Interview Fragen
Fazit
In diesem Artikel werden fast alle wichtigen Codierungs- und Programmierthemen des C ++ - Interviews behandelt.
Wir hoffen, dass sich jeder Kandidat nach der Vorbereitung eines Interviews mit dieser Reihe von Interviewfragen entspannt fühlt.
Alles Gute für dein Interview !!
Literatur-Empfehlungen
- Interview Fragen und Antworten
- Fragen und Antworten zum ETL-Testinterview
- Einige knifflige manuelle Testfragen und -antworten
- 25 Fragen und Antworten zu den besten Agile Testing-Interviews
- Spock Interview Fragen mit Antworten (am beliebtesten)
- Einige interessante Fragen zu Softwaretests
- Top 20+ .NET Interview Fragen und Antworten
- Top 32 der besten Fragen und Antworten zum Datastage-Interview