Heim  >  Artikel  >  Backend-Entwicklung  >  Wie viele dieser 19 C/C+-Interviewfragen können Sie richtig beantworten? - Persönlicher Artikel Sifu

Wie viele dieser 19 C/C+-Interviewfragen können Sie richtig beantworten? - Persönlicher Artikel Sifu

php是最好的语言
php是最好的语言Original
2018-07-26 18:07:031715Durchsuche

Was ist der Unterschied zwischen C und C++? Antwort: C++ fügt Klassen auf Basis von C hinzu. C ist eine strukturierte Sprache, deren Schwerpunkt auf Algorithmen und Datenstrukturen liegt. Die Vorstellungsgespräche für Software-Ingenieure sind alle gleich. Beim nächsten Mal stoßen Sie möglicherweise auf dieselben Fragen, die Sie dieses Mal gestellt haben.

Frage 1: Bitte sagen Sie mir, was C++ in einfacher Sprache ist.

Antwort: C++ ist eine objektorientierte Programmiersprache, die auf der Basis der C-Sprache entwickelt wurde und weit verbreitet ist. C++ unterstützt mehrere Programmierparadigmen – objektorientierte Programmierung, generische Programmierung und prozedurale Programmierung. Es verfügt über ein breites Spektrum an Programmierbereichen und wird häufig in der Systementwicklung, Engine-Entwicklung und anderen Anwendungsbereichen verwendet. Es ist eine der leistungsstärksten Programmiersprachen, die von Programmierern verwendet werden. Es unterstützt Klassen: Klassen, Kapselung, Überladung und weitere Funktionen!

Frage 2: Was ist der Unterschied zwischen C und C++?

Antwort: C++ fügt Klassen auf Basis von C hinzu. C ist eine strukturierte Sprache, deren Schwerpunkt auf Algorithmen und Datenstrukturen liegt. Die wichtigste Überlegung beim Entwurf eines C-Programms ist, wie die Eingabe (oder Umgebungsbedingungen) durch einen Prozess verarbeitet wird, um die Ausgabe zu erhalten (oder wie die Prozesssteuerung (Transaktion) implementiert wird). Modell, damit Dieses Modell in die entsprechende Problemdomäne passen kann, sodass eine Ausgabe- oder Prozesssteuerung (Transaktionssteuerung) durch Abrufen der Statusinformationen des Objekts erreicht werden kann. Der Herausgeber empfiehlt einen Lernrock zum Erlernen der C-Sprache/C++ [627, 012, 464] Egal, ob Sie Experte oder Anfänger sind, sich beruflich verändern oder in die Branche einsteigen möchten, Sie können sich darüber informieren und gemeinsam lernen! Im Inneren des Rocks befinden sich Entwicklungstools und es werden viele nützliche Informationen und technische Informationen weitergegeben!

Frage 3: Was ist objektorientiert (OOP)?

Antwort: Objektorientiert ist eine Methode und Idee zum Verstehen und Abstrahieren der realen Welt. Es ist eine Idee, die Probleme durch die Umwandlung von Nachfrageelementen in Objekte löst.

Frage 4: Was ist Polymorphismus?

Antwort: Polymorphismus bedeutet, dass die gleiche Operation, Funktion oder derselbe Prozess auf mehrere Objekttypen angewendet werden kann und unterschiedliche Ergebnisse erzielt. Verschiedene Objekte können beim Empfang derselben Nachricht unterschiedliche Ergebnisse liefern. Dieses Phänomen wird als Polymorphismus bezeichnet.

Frage 5: Verstehen Sie Designmuster? Können Sie mir ein einfaches Beispiel geben?

Antwort: Design Pattern ist eine Reihe klassifizierter und katalogisierter Zusammenfassungen von Code-Design-Erfahrungen, die wiederholt verwendet werden und den meisten Menschen bekannt sind.

Zum Beispiel stellt das Singleton-Muster sicher, dass eine Klasse nur eine Instanz hat und stellt einen globalen Zugriffspunkt für den Zugriff darauf bereit.

Gilt für: wenn die Klasse nur eine Instanz haben kann und der Client von einem bekannten Zugriffspunkt aus darauf zugreifen kann; wenn diese einzelne Instanz durch Unterklassen erweiterbar sein soll und der Client sie nicht ändern muss Code Wenn eine erweiterte Instanz verwendet werden kann.

Zum Beispiel definiert das Factory-Muster eine Schnittstelle zum Erstellen von Objekten und lässt Unterklassen entscheiden, welche Klasse instanziiert werden soll. Die Factory-Methode bewirkt, dass die Instanziierung einer Klasse auf ihre Unterklassen verschoben wird.

Gilt für: wenn eine Klasse die Klasse des Objekts nicht kennt, das sie erstellen muss; wenn eine Klasse möchte, dass ihre Unterklasse das Objekt angibt, das sie erstellen soll; wenn die Verantwortung an eine Klasse delegiert wird; von mehreren Hilfsunterklassen, und Sie möchten die Informationen darüber lokalisieren, welche Hilfsunterklasse der Delegat ist.

Frage 6: Haben Sie jemals die STL-Bibliothek verwendet? Was sind die gängigen STL-Container? Welche Algorithmen wurden verwendet?

Antwort: STL besteht aus zwei Teilen: Container und Algorithmus. (Es ist auch wichtig, die beiden Iteratoren zu kombinieren)

Container, in dem Daten gespeichert werden. Wie Array usw.

In STL werden Container in zwei Kategorien unterteilt: sequentielle Container und assoziative Container.

Sequentieller Container, die darin enthaltenen Elemente sind nicht unbedingt in der richtigen Reihenfolge, aber sie können alle sortiert werden. Zum Beispiel: Vektor, Liste, Deque, Stapel, Warteschlange, Heap, Prioritätswarteschlange, Slist;

Assoziativer Container, die interne Struktur ist im Grunde ein ausgeglichener Binärbaum. Die sogenannte Assoziation bedeutet, dass jedes Element einen Schlüsselwert und einen realen Wert hat und die Elemente nach bestimmten Regeln gespeichert werden. Zum Beispiel: RB-Baum, Set, Karte, Multiset, Multimap, Hashtable, Hash_Set, Hash_Map, Hash_Multiset, Hash_Multimap.

Wählen Sie unten jeweils eine davon als Erklärung aus.

Vektor: Es handelt sich um einen Container, der Speicherplatz dynamisch zuweist. Im Gegensatz zum Array in C++ ist der vom Array zugewiesene Speicherplatz statisch und kann nach der Zuweisung nicht geändert werden, während der Vektor den Speicherplatz automatisch neu zuweist (erweitert).

set: Seine internen Elemente werden automatisch nach dem Schlüsselwert des Elements sortiert. Im Gegensatz zur Karte sind ihre Schlüsselwerte reale Werte, und die Karte kann gleichzeitig unterschiedliche Schlüsselwerte und reale Werte haben.

Algorithmen wie Sortieren, Kopieren... und Container-spezifische Algorithmen. Dieser Punkt muss nicht allzu ausführlich vorgestellt werden, er hängt hauptsächlich vom Inhalt des folgenden Iterators ab.

Iterator ist die Essenz von STL. Wir beschreiben es so: Iterator bietet eine Möglichkeit, nacheinander auf die verschiedenen in einem Container enthaltenen Elemente zuzugreifen, ohne die interne Struktur des Containers offenzulegen. Es trennt den Container und den Algorithmus, sodass sie unabhängig voneinander entworfen werden können.

Frage 7: Wird die Datenstruktur bekannt sein? Welche werden im Projektentwicklungsprozess hauptsächlich verwendet?

Antwort: Arrays, verknüpfte Listen und Bäume (seltener) werden hauptsächlich in Datenstrukturen verwendet, und auch die Ideen von Stapeln und Warteschlangen werden verwendet.

Frage 8: Kennen Sie const? Erklären Sie seine Funktion.

Antwort:

1.const ändert die Mitgliedsvariablen der Klasse, gibt Mitgliedskonstanten an und kann nicht geändert werden.

2. Die const-modifizierte Funktion verspricht, die Datenmitglieder in der Klasse innerhalb dieser Funktion nicht zu ändern und keine anderen Nicht-Const-Memberfunktionen aufzurufen.

3. Wenn const eine Funktionsüberladung darstellt, können const-Objekte nur const-Funktionen aufrufen, und nicht-const-Objekte rufen zuerst nicht-const-Funktionen auf.

4.const-Funktionen können nur const-Funktionen aufrufen. Nicht konstante Funktionen können konstante Funktionen aufrufen.

5. Const-Memberfunktionen, die außerhalb der Klasse definiert sind, erfordern const-Modifikatoren sowohl bei der Definition als auch bei der Deklaration.

Frage 9: Wann werden die statischen Variablen der Klasse initialisiert? Wann werden die statischen Variablen einer Funktion initialisiert?

Antwort: Die statischen Mitgliedsvariablen der Klasse sind bereits vorhanden und Speicher wird zugewiesen, bevor die Klasse instanziiert wird. Die statischen Variablen einer Funktion werden initialisiert, wenn diese Funktion ausgeführt wird.

Frage 10: Was ist der Unterschied zwischen Heap und Stack? Heap- und Stack-Lebenszyklus?

Antwort:

1. Unterschiede in der Stapelplatzzuweisung:

1. Stapel (Betriebssystem): Wird vom Betriebssystem automatisch zugewiesen und freigegeben, um Funktionsparameterwerte zu speichern ​und lokale Variablenwerte usw. Seine Betriebsmethode ähnelt der des Stapels in der Datenstruktur. 2. Heap (Betriebssystem): Er wird im Allgemeinen vom Programmierer zugewiesen und freigegeben. Wenn der Programmierer ihn nicht freigibt, kann er recycelt werden das Betriebssystem, wenn das Programm endet. Die Zuordnungsmethode ist in der verknüpften Liste ähnlich.

2. Unterschiede in den Stack-Caching-Methoden:

1. Der Stack verwendet beim Aufruf normalerweise einen Cache der ersten Ebene und wird sofort nach dem Aufruf freigegeben abgeschlossen;

2. Der Heap wird im Cache der zweiten Ebene gespeichert und sein Lebenszyklus wird durch den Garbage-Collection-Algorithmus der virtuellen Maschine bestimmt (dies bedeutet nicht, dass er recycelt werden kann, sobald er zu einem wird). verwaistes Objekt). Daher ist die Geschwindigkeit beim Aufrufen dieser Objekte relativ gering.

3. Unterschiede in der Stapeldatenstruktur:

Heap (Datenstruktur): Der Heap kann als Baum betrachtet werden, wie zum Beispiel: Heap-Sortierung; Struktur) ): Eine First-In-Last-Out-Datenstruktur.

Frage 11: Kapselung, Vererbung und Polymorphismus erklären?

Antwort:

1. Kapselung:

Kapselung ist der erste Schritt bei der Realisierung objektorientierter Programmierung Klassen).

Die Bedeutung der Kapselung besteht darin, Code (Daten) vor einer versehentlichen Zerstörung durch uns zu schützen oder zu verhindern.

2. Vererbung:

Vererbung ermöglicht hauptsächlich die Wiederverwendung von Code und spart Entwicklungszeit.

Unterklassen können einige Dinge von der übergeordneten Klasse erben.

3. Polymorphismus

Polymorphismus: Die gleiche Operation wirkt sich auf verschiedene Objekte aus und kann unterschiedliche Interpretationen haben und zu unterschiedlichen Ausführungsergebnissen führen. Zur Laufzeit können Sie Methoden in einer abgeleiteten Klasse über einen Zeiger auf die Basisklasse aufrufen.

Frage 12: Was ist der Unterschied zwischen Zeigern und Referenzen?

Antwort:

Ein Zeiger ist eine Variable, aber diese Variable speichert eine Adresse und zeigt auf eine Speichereinheit im Speicher; 🎜 >

  1. Referenzen müssen bei Verwendung nicht dereferenziert werden (*), Zeiger müssen dereferenziert werden

  2. Referenzen können nur einmal initialisiert werden, wenn sie definiert sind , und sind danach unveränderlich;

  3. Referenzen haben keine Konstante; Zeiger können null sein;

  4. „sizeof reference“ erhält die Größe der Variablen (Objekt), auf die gezeigt wird, während „sizeof pointer“ die Größe des Zeigers selbst erhält

  5. Die Bedeutung der Inkrementierungsoperation (++) von Zeigern und Referenzen ist unterschiedlich.

  6. Zeiger können mehrere Ebenen haben, Referenzen können jedoch nur eine Ebene haben (int **p; legal und int &&a ist unzulässig)

  7. 9 Aus Sicht der Speicherzuweisung: Das Programm weist einen Speicherbereich für Zeigervariablen zu, während dies für Referenzen nicht erforderlich ist einen Speicherbereich zuweisen.

    Frage 13: Was ist ein Speicherverlust? Welche Methoden haben Sie angesichts von Speicherlecks und Zeiger außerhalb der Grenzen? Welche Methoden nutzen Sie normalerweise, um diese Art von Fehlern zu vermeiden und zu reduzieren?
  8. Antwort: Der mithilfe der dynamischen Speicherzuweisungsfunktion dynamisch geöffnete Speicherplatz wird nach der Verwendung nicht freigegeben. Dadurch ist die Speichereinheit immer belegt, was einen Speicherverlust darstellt.

    Denken Sie bei der Verwendung an die Länge des Zeigers.
Beim Mallocing müssen Sie sicherstellen, dass es frei ist.

Beim Zuweisen eines Zeigers sollten Sie darauf achten, ob der zugewiesene Zeiger freigegeben werden muss.

Das ist es Am besten verwenden Sie keine dynamisch zugewiesenen Speicherzeiger.

Frage 14: Welche Sortieralgorithmen werden häufig verwendet? Beschreiben Sie kurz die Vor- und Nachteile verschiedener Sortieralgorithmen.

Antwort: Auswählen, Blasen, Schnell, **, Hügel, Zusammenführen, Stapeln usw.

1. Schnelle Sortierung: Es handelt sich um eine Verbesserung der Blasensortierung.

Vorteile: schnell, weniger Datenbewegung

Nachteile: unzureichende Stabilität

2. Zusammenführen: Divide-and-Conquer-Sortierung, ein stabiler Sortieralgorithmus, der im Allgemeinen für die Gesamtordnung verwendet wird , sondern eine lokal geordnete Folge.

Vorteile: Hohe Effizienz O(n), stabil

Nachteile: Es nimmt mehr Speicher in Anspruch

Frage 15: Was ist der Unterschied zwischen new und malloc?

Antwort:

1. malloc und free sind Standardbibliotheksfunktionen der C++/C-Sprache und new/delete sind Operatoren von C++. Sie können beide verwendet werden, um dynamischen Speicher zu beantragen und Speicher freizugeben.

2. Bei Objekten nicht interner Datentypen kann maloc/free allein die Anforderungen dynamischer Objekte nicht erfüllen. Das Objekt muss den Konstruktor automatisch ausführen, wenn es erstellt wird, und das Objekt muss den Destruktor automatisch ausführen, bevor es stirbt.

3. Da es sich bei malloc/free um eine Bibliotheksfunktion und nicht um einen Operator handelt, liegt die Aufgabe, Konstruktoren und Destruktoren auszuführen, nicht bei malloc/free. Daher benötigt die C++-Sprache einen Operator new, der die dynamische Speicherzuweisung und -initialisierung abschließen kann, und einen Operator delete, der die Arbeit des Bereinigens und Freigebens von Speicher abschließen kann. Beachten Sie, dass Neu/Löschen keine Bibliotheksfunktionen sind.

4. C++-Programme rufen häufig C-Funktionen auf, aber C-Programme können nur malloc/free zur Verwaltung des dynamischen Speichers verwenden.

5. Neu kann als Ausführung des malloc plus-Konstruktors betrachtet werden. Der Zeiger von new trägt direkt Typinformationen. Malloc gibt leere Zeiger zurück.

Frage 16: Was ist der Unterschied zwischen TCP- und UDP-Kommunikation? Was ist IOCP?

Antwort:

1.TCP ist verbindungsorientiert, UDP ist verbindungslos

2.TCP ist garantiert, UDP-Übertragung ist nicht garantiert

3 . TCP ist ineffizient, UDP ist hocheffizient

4.TCP basiert auf Streams, UDP basiert auf Datenpaketen

5.TCP überträgt wichtige Daten und UDP überträgt unwichtige Daten

IOCP steht für I/O Completion Port, was ins Chinesische als I/O Completion Port übersetzt wird.

IOCP ist eine asynchrone I/O-API, die Anwendungen effizient über I/O-Ereignisse benachrichtigen kann.

Im Gegensatz zur Verwendung von select() oder anderen asynchronen Methoden ist ein Socket [Socket] einem Abschlussport zugeordnet, und dann können normale Winsock-Vorgänge fortgesetzt werden. Wenn jedoch ein Ereignis auftritt, wird der Abschlussport vom Betriebssystem zu einer Warteschlange hinzugefügt. Die Anwendung kann dann die Kernschicht nach diesem Abschlussport abfragen.

Frage 17: Was ist der Unterschied zwischen synchronem IO und asynchronem IO?

Antwort:

A. Synchronisation

Die sogenannte Synchronisation bedeutet, dass beim Ausgeben eines Funktionsaufrufs der Aufruf erst zurückgegeben wird, wenn das Ergebnis vorliegt.

Nach dieser Definition werden die meisten Funktionen tatsächlich synchron aufgerufen (z. B. sin isdigit usw.).

Aber im Allgemeinen beziehen wir uns, wenn wir von synchron und asynchron sprechen, speziell auf Aufgaben, die die Zusammenarbeit anderer Komponenten erfordern oder eine gewisse Zeit in Anspruch nehmen.

Das häufigste Beispiel ist SendMessage.

Diese Funktion sendet eine Nachricht an ein bestimmtes Fenster. Diese Funktion kehrt erst zurück, wenn die andere Partei die Nachricht verarbeitet hat.

Nachdem die andere Partei die Verarbeitung abgeschlossen hat, gibt diese Funktion den von der Nachrichtenverarbeitungsfunktion zurückgegebenen Wert an den Anrufer zurück.

B. Asynchron

Das Konzept von Asynchronität ist relativ zur Synchronisation.

Wenn ein asynchroner Prozeduraufruf ausgegeben wird, erhält der Aufrufer das Ergebnis nicht sofort.

Die Komponente, die diesen Anruf tatsächlich bearbeitet, besteht darin, den Anrufer nach der Ausgabe des Anrufs über Status und Benachrichtigung zu benachrichtigen oder den Anruf über eine Rückruffunktion zu verarbeiten.

Frage 18: Statische Funktionen und statische Variablen in C++ erklären?

Antwort:

(1) Statische Datenelemente der Klasse werden zur Kompilierzeit erstellt und initialisiert: Sie existieren, bevor ein Objekt der Klasse erstellt wird, sie gehören zu keinem Objekt und sie sind keine statischen Klassenmitgliedsvariablen. Es gehört zum Objekt. Es gibt nur eine Kopie der statischen Datenelemente einer Klasse, die von allen Objekten dieser Klasse gemeinsam genutzt wird.

(2) Statische Mitgliedsfunktionen der Klasse gehören zur gesamten Klasse, nicht zu einem bestimmten Objekt, und werden von allen Objekten der Klasse gemeinsam genutzt.

1. Statische Mitgliedsvariablen realisieren den Informationsaustausch zwischen ähnlichen Objekten.

2. Statische Mitglieder werden außerhalb der Klasse gespeichert, die nicht enthalten ist.

3. Das statische Mitglied ist eine globale Variable, die zur Klasse im Namespace gehört und im rw-Segment des Datenbereichs gespeichert ist.

4. Statische Mitglieder können nur außerhalb der Klasse initialisiert werden.

5. Der Zugriff erfolgt über den Klassennamen (auch wenn kein Objekt generiert wird) oder über das Objekt.

1. Die Bedeutung statischer Elementfunktionen besteht nicht darin, Informationen auszutauschen und Daten zu kommunizieren, sondern darin, statische Datenelemente zu verwalten und die Kapselung statischer Datenelemente abzuschließen.

2. Statische Memberfunktionen können nur auf statische Datenmember zugreifen. Grund: Bei nicht statischen Memberfunktionen wird der Zeiger this beim Aufruf als Parameter übergeben. Statische Memberfunktionen gehören zu Klassen, nicht zu Objekten, und haben diese Zeiger nicht.

Frage 19: Erzählen Sie mir etwas über Ihr Verständnis von Gedächtnis?

Antwort:

1. Heap – automatisch vom Compiler zugewiesen und freigegeben

2. Heap – im Allgemeinen vom Programmierer zugewiesen und freigegeben , wenn das Programm endet Kann vom Betriebssystem recycelt werden

3. Globaler Bereich (statischer Bereich), globale Variablen und statische Variablen werden zusammen gespeichert, initialisierte globale Variablen und statische Variablen befinden sich im selben Bereich, nicht initialisierte globale Variablen und nicht initialisiert Die initialisierten statischen Variablen befinden sich in einem anderen angrenzenden Bereich. - Freigabe, wenn das Programm endet

4. Es gibt auch einen speziellen Platz für Konstanten. - Wird freigegeben, wenn das Programm endet

5 Programmcodebereich, der Binärcodes speichert.

Variablen, die im Funktionskörper definiert sind, befinden sich normalerweise auf dem Stapel, und diejenigen, die von Funktionen wie malloc, calloc, realloc usw. zugewiesen werden, die Speicher zuweisen, befinden sich auf dem Heap. Globale Variablen werden außerhalb des Hauptteils aller Funktionen definiert. Nach dem Hinzufügen des statischen Modifikators werden sie im globalen Bereich (statischer Bereich) gespeichert, unabhängig davon, wo sie sich befinden. Die außerhalb des Hauptteils aller Funktionen definierten Variablen sind in der Datei gültig Kann nicht in andere Dateien exportiert werden. Die Verwendung von „statisch“ in einem Funktionskörper bedeutet, dass es nur innerhalb des Funktionskörpers gültig ist. Darüber hinaus werden Zeichenfolgen wie „adgfdf“ in der Funktion im Konstantenbereich gespeichert.

Verwandte Artikel:

125 grundlegende Fragen und Antworten zu C#-Interviews teilen

Verwandte Videos:

Ausführliches Video-Tutorial zu Interviewfragen, das den PHP-Arbeitsplatz erfasst

Das obige ist der detaillierte Inhalt vonWie viele dieser 19 C/C+-Interviewfragen können Sie richtig beantworten? - Persönlicher Artikel Sifu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn