constructor überladen - Gibt es in C++einen impliziten Standardkonstruktor?




initialisierung objekt (10)

  • Generiert der Compiler automatisch einen Standardkonstruktor?
  • Führt der implizit generierte Standardkonstruktor eine Nullinitialisierung durch?

Wenn du die Sprache des Standards von 2003 legal parst, dann sind die Antworten ja und nein . Dies ist jedoch nicht die ganze Geschichte, da im Gegensatz zu einem benutzerdefinierten Standardkonstruktor ein implizit definierter Standardkonstruktor nicht immer beim Erstellen eines Objekts von Grund auf verwendet wird - es gibt zwei andere Szenarien: keine Konstruktion und teilweisen Werteinitialisierung .

Der "no construction" -Fall ist eigentlich nur eine technische Eigenschaft, da er funktional nicht anders ist als der triviale Standardkonstruktor. Der andere Fall ist interessanter: member-wise value-initialization wird mit "()" aufgerufen [als würde man explizit einen Konstruktor aufrufen, der keine Argumente hat] und umgeht das, was man technisch als Standardkonstruktor bezeichnet . Stattdessen führt er rekursiv eine Wert-Initialisierung für jedes Datenelement durch, und für primitive Datentypen wird schließlich eine Null-Initialisierung durchgeführt .

Der Compiler stellt also zwei verschiedene implizit definierte Standardkonstruktoren zur Verfügung . Eine davon führt eine Null-Initialisierung der Grundelementdaten durch und die andere nicht. Hier sind einige Beispiele, wie Sie jeden Typ von Konstruktor aufrufen können:

    MyClass a; // default-construction or no construction
    MyClass b = MyClass(); // member-wise value-initialization

und

    new MyClass; // default-construction or no construction
    new MyClass(); // member-wise value-initialization

Hinweis: Wenn ein benutzerdefinierter Standardkonstruktor vorhanden ist, ruft die teilweisen Wertinitialisierung diesen einfach auf und stoppt.

Hier ist eine etwas detaillierte Aufschlüsselung dessen, was der Standard dazu sagt ...

  • Wenn Sie keinen Konstruktor deklarieren, erstellt der Compiler implizit einen Standardkonstruktor [12.1-5].

  • Der Standardkonstruktor initialisiert primitive Typen nicht [12.1-7]

    MyClass() {} // implicitly defined constructor
    
  • Wenn Sie ein Objekt mit "()" initialisieren, ruft dies nicht direkt den Standardkonstruktor auf. Stattdessen initiiert es eine lange Sequenz von Regeln namens Wert-Initialisierung [8.5-7]

  • Der Nettoeffekt der Wertinitialisierung ist, dass der implizit deklarierte Standardkonstruktor nie aufgerufen wird . Stattdessen wird eine rekursive elementweise Wertinitialisierung aufgerufen, die schließlich alle primitiven Elemente initialisiert und den Standardkonstruktor für alle Elemente aufruft, die über einen vom Benutzer deklarierten Konstruktor [8.5-5] verfügen.

  • Wert-Initialisierung gilt auch für primitive Typen - sie werden Null-initialisiert. [8.5-5]

    a = int(); // equivalent to int a=0;
    

All dies ist für die meisten Zwecke wirklich strittig. Der Schreiber einer Klasse kann im Allgemeinen nicht davon ausgehen, dass Datenelemente während einer impliziten Initialisierungssequenz auf Null gesetzt werden. Daher sollte jede selbstverwaltende Klasse ihren eigenen Konstruktor definieren, wenn sie über primitive Datenelemente verfügt, die initialisiert werden müssen.

Also, wann ist das wichtig?

  • Unter Umständen kann generischer Code die Initialisierung unbekannter Typen erzwingen. Value-Initialisierung bietet eine Möglichkeit, dies zu tun. Denken Sie daran, dass die implizite Zero-Initialisierung nicht auftritt, wenn der Benutzer einen Konstruktor bereitgestellt hat.

  • Standardmäßig sind die Daten von std :: vector value-initialisiert. Dies kann verhindern, dass Speicherdebugger logische Fehler identifizieren, die ansonsten nicht initialisierten Speicherpuffern zugeordnet sind.

    vector::resize( size_type sz, T c=T() ); // default c is "value-initialized"
    
  • Ganze Arrays von Primitivtypen oder Strukturen vom Typ "plain-alt-data" (POD) können mit Hilfe der Wertinitialisierungssyntax auf Null initialisiert werden.

    new int[100]();
    

Dieser Beitrag enthält mehr Details zu Variationen zwischen den Versionen des Standards und enthält auch einen Fall, in dem der Standard in wichtigen Compilern unterschiedlich angewendet wird.

In dem Buch, das ich gerade lese ( C ++ Without Fear ) heißt es, dass der Compiler, wenn Sie keinen Standardkonstruktor für eine Klasse deklarieren, einen für Sie bereitstellt, der "jedes Datenelement" ausfüllt. Ich habe damit experimentiert und sehe kein Nullsetzungsverhalten. Ich kann auch nichts finden, was dies bei Google erwähnt. Ist das nur ein Fehler oder eine Eigenart eines bestimmten Compilers?


C ++ generiert einen Standardkonstruktor. Wenn nötig (bestimmt zur Kompilierzeit glaube ich), wird es auch einen Standardkopiekonstruktor und einen Standardzuweisungskonstruktor erzeugen. Ich habe jedoch nichts über Garantien für das Löschen von Speicher gehört.


Nullen ist nur bei Globalen möglich. Wenn also Ihr Objekt im globalen Gültigkeitsbereich deklariert ist, werden seine Mitglieder auf Null gesetzt:

class Blah
{
public:
    int x;
    int y;
};

Blah global;

int main(int argc, char **argv) {
    Blah local;
    cout<<global.x<<endl;  // will be 0
    cout<<local.x<<endl;   // will be random
}

Ich denke, es ist erwähnenswert, dass der Standardkonstruktor nur vom Compiler erstellt wird, wenn Sie überhaupt keinen Konstruktor bereitstellen. Das heißt, wenn Sie nur einen Konstruktor angeben, der ein Argument akzeptiert, erstellt der Compiler nicht den Standard-Konstruktor no-arg für Sie.

Das Nullsetzungsverhalten, von dem Ihr Buch spricht, ist wahrscheinlich spezifisch für einen bestimmten Compiler. Ich habe immer angenommen, dass es variieren kann und dass Sie alle Datenmitglieder explizit initialisieren sollten.


Der Standardkonstruktor, der für eine Klasse erstellt wird, initialisiert nicht integrierte Typen, sondern ruft den Standardkonstruktor für alle benutzerdefinierten Member auf:

class Foo
{
public:
     int x;
     Foo() : x(1) {}
};

class Bar
{
public:
     int y;
     Foo f;
     Foo *fp;
};

int main()
{

    Bar b1; 
    ASSERT(b1.f.x == 1); 
    // We know nothing about what b1.y is set to, or what b1.fp is set to.

    // The class members' initialization parallels normal stack initialization.
    int y;  
    Foo f; 
    Foo *fp; 
    ASSERT(f.x == 1);
    // We know nothing about what y is set to, or what fp is set to.

}

C ++ garantiert nicht das Löschen von Speicher. Java und C # machen (sozusagen).

Einige Compiler könnten das, sind aber nicht davon abhängig.


Wenn Sie keinen Konstruktor definieren, definiert der Compiler einen Standardkonstruktor für Sie.

Die Umsetzung dieses

Standardkonstruktor ist:

  • Standardkonstrukt die Basisklasse (wenn die Basisklasse keinen Standardkonstruktor hat, ist dies ein Kompilierungsfehler)
  • Standardkonstrukt jede Mitgliedsvariable in der Reihenfolge der Deklaration. (Wenn ein Member keinen Standardkonstruktor hat, ist dies ein Kompilierungsfehler).

Hinweis:
Die POD-Daten (int, float, pointer, etc.) haben keinen expliziten Konstruktor, aber die Standardaktion ist, nichts zu tun (in der C ++ - Philosophie; wir wollen nicht für etwas bezahlen, es sei denn wir fragen explizit danach) .

Wenn kein Destruktor / Copy-Konstruktor / Zuweisungsoperator definiert ist, erstellt der Compiler einen dieser Konstrukte (also hat eine Klasse immer einen Destruktor / Konstruktor / Zuweisungsoperator kopieren (es sei denn, Sie betrügen und deklarieren einen explizit, aber definieren ihn nicht)).
Die Standardimplementierung ist:

Destruktor:

  • Wenn ein benutzerdefinierter Destruktor definiert ist, führen Sie den bereitgestellten Code aus.
  • Rufen Sie den Destruktor jedes Mitglieds in umgekehrter Reihenfolge der Deklaration auf
  • Rufen Sie den Destruktor der Basisklasse auf.

Konstruktor kopieren:

  • Rufen Sie die Basisklasse Copy Constructor auf.
  • Rufen Sie den Kopierkonstruktor für jede Elementvariable in der Reihenfolge der Deklaration auf.

Aufgabenverwalter:

  • Rufen Sie den Basisklassenzuweisungsoperator auf
  • Rufen Sie den Zuweisungsoperator jeder Mitgliedsvariablen in der Reihenfolge der Deklaration auf.
  • Gib eine Referenz zurück.

Hinweis Kopieren Sie den Konstruktions- / Zuweisungsoperator von POD-Daten kopiert nur die Daten (daher das Problem der flachen Kopie in Verbindung mit RAW-Zeigern).


C ++ generiert einen Standardkonstruktor aber nur, wenn Sie keinen eigenen angeben. Der Standard sagt nichts über das Zurücksetzen von Datenmitgliedern aus. Wenn Sie ein Objekt zum ersten Mal konstruieren, sind sie standardmäßig nicht definiert.

Dies kann verwirrend sein, da die meisten primitiven C ++ - Typen über Standardkonstruktoren verfügen, die sie auf Null setzen (int (), bool (), double (), long () usw. ), der Compiler jedoch nicht aufruft sie zu init POD-Mitgliedern wie es für Objektmitglieder tut.

Es ist erwähnenswert, dass die STL diese Konstruktoren verwendet, um den Inhalt von Containern, die primitive Typen enthalten, standardmäßig zu konstruieren. Sie können sich diese Frage ansehen , um mehr darüber zu erfahren, wie Dinge in STL-Containern integriert werden.


Der Compiler generiert standardmäßig nicht den Standardkonstruktor, es sei denn, die Implementierung benötigt keinen. Also, im Grunde muss der Konstruktor ein nicht-trivialer Konstruktor sein .

Damit der Konstruktor ein nicht-trivialer Konstruktor ist, sind die Bedingungen, unter denen einer genügen kann:

1) Die Klasse hat eine virtuelle Mitgliedsfunktion. 2) Klassenmitglieder-Unterobjekte oder Basisklassen haben nicht-triviale Konstruktoren. 3) Eine Klasse hat eine virtuelle Vererbungshierarchie.


Anfänger

Einführungskurs, keine Programmiererfahrung

  • C ++ Primer * (Stanley Lippman, Josée Lajoie und Barbara E. Moo) ( aktualisiert für C ++ 11 ) Mit 1k Seiten ist dies eine sehr gründliche Einführung in C ++, die nahezu alles in der Sprache in einem zugänglichen Format abdeckt und sehr detailliert. Die fünfte Ausgabe (veröffentlicht am 16. August 2012) behandelt C ++ 11. [Review]

  • Programmierung: Grundlagen und Praxis mit C ++ (Bjarne Stroustrup, 2. Auflage - 25. Mai 2014) ( aktualisiert für C ++ 11 / C ++ 14 ) Eine Einführung in die Programmierung mit C ++ durch den Ersteller der Sprache. Eine gute Lektüre, die keine Programmiererfahrung voraussetzt, aber nicht nur für Anfänger geeignet ist.

* Nicht zu verwechseln mit C ++ Primer Plus (Stephen Prata), mit einer deutlich ungünstigeren review .

Einführungskurs mit vorheriger Programmiererfahrung

  • Eine Tour durch C ++ (Bjarne Stroustrup) ( 2. Auflage für C ++ 17 ) Die "Tour" ist eine kurze (ca. 180 Seiten und 14 Kapitel) Tutorial-Übersicht über alle Standard-C ++ - Funktionen (Sprache und Standardbibliothek sowie C ++) 11 ) auf einem mäßig hohen Niveau für Leute, die C ++ bereits kennen oder zumindest erfahrene Programmierer sind. Dieses Buch ist eine erweiterte Version des Materials, das die Kapitel 2-5 der C ++ - Programmiersprache, 4. Auflage, darstellt.

  • Accelerated C ++ (Andrew Koenig und Barbara Moo, 1. Auflage - 24. August 2000) Dies umfasst im Wesentlichen die gleichen Grundlagen wie die C ++ - Grundierung , jedoch nur ein Viertel ihres Platzes. Dies ist hauptsächlich darauf zurückzuführen, dass nicht versucht wird, eine Einführung in die Programmierung zu erhalten , sondern eine Einführung in C ++ für Personen, die zuvor in einer anderen Sprache programmiert haben. Die Lernkurve ist steiler, aber für diejenigen, die damit umgehen können, ist dies eine sehr kompakte Einführung in die Sprache. (In der Vergangenheit beschritt es Neuland, indem es das erste Anfängerbuch war, das einen modernen Ansatz zum Unterrichten der Sprache verwendete.) Trotzdem ist C ++, das es lehrt, rein C ++ 98. [Review]

Best Practices

  • Effective C ++ (Scott Meyers, 3. Auflage - 22. Mai 2005) Dies wurde mit dem Ziel verfasst, das beste zweite Buch zu sein, das C ++ - Programmierer lesen sollten, und es gelang ihm. Frühere Ausgaben waren für Programmierer gedacht, die aus C kommen, die dritte Auflage ändert dies und richtet sich an Programmierer, die aus Sprachen wie Java kommen. Es enthält ~ 50 leicht zu merkende Faustregeln und ihre Gründe in einem sehr zugänglichen (und angenehmen) Stil. Für C ++ 11 und C ++ 14 sind die Beispiele und einige Probleme veraltet, und Effective Modern C ++ sollte bevorzugt werden. [Review]

  • Effective Modern C ++ (Scott Meyers) Dies ist im Wesentlichen die neue Version von Effective C ++ , die sich an C ++ - Programmierer richtet, die den Übergang von C ++ 03 zu C ++ 11 und C ++ 14 vornehmen.

  • Effective STL (Scott Meyers) Damit soll der Teil der Standardbibliothek, der aus der STL stammt, dasselbe tun, was Effective C ++ mit der Sprache insgesamt getan hat: Es werden Faustregeln zusammen mit ihrer Begründung dargestellt. [Review]

Mittlere

  • Effektiveres C ++ (Scott Meyers) Noch mehr Faustregeln als effektives C ++ . Nicht so wichtig wie die im ersten Buch, aber trotzdem gut zu wissen.

  • Außergewöhnliches C ++ (Herb Sutter) Dieses Rätselpaket enthält eine der besten und gründlichsten Diskussionen über das ordnungsgemäße Ressourcenmanagement und die Ausnahmesicherheit in C ++ durch die Ressourcenerfassung (RAII) sowie die ausführliche Beschreibung einer Vielzahl Weitere Themen, darunter das Pimpl-Idiom, die Namenssuche, das Design guter Klassen und das C ++ - Speichermodell. [Review]

  • Mehr Außergewöhnliches C ++ (Herb Sutter) Umfasst zusätzliche Sicherheitsthemen für Ausnahmen, die nicht in Außergewöhnlichem C ++ behandelt werden , zusätzlich zur Diskussion der effektiven objektorientierten Programmierung in C ++ und der korrekten Verwendung der STL. [Review]

  • Außergewöhnlicher C ++ - Stil (Herb Sutter) Erläutert generische Programmierung, Optimierung und Ressourcenverwaltung. Dieses Buch bietet auch eine hervorragende Darstellung darüber, wie modularer Code in C ++ unter Verwendung von Nichtmitgliederfunktionen und des Prinzips der Einzelverantwortung geschrieben wird. [Review]

  • C ++ - Codierungsstandards (Herb Sutter und Andrei Alexandrescu) "Codierungsstandards" bedeutet hier nicht "wie viele Leerzeichen sollte ich meinen Code einrücken". Dieses Buch enthält 101 bewährte Vorgehensweisen, Idiome und häufige Fallstricke, die Ihnen beim Schreiben von Code helfen können. verständlicher und effizienter C ++ - Code. [Review]

  • C ++ - Vorlagen: Das vollständige Handbuch (David Vandevoorde und Nicolai M. Josuttis) Dies ist das Buch über Vorlagen, wie sie vor C ++ 11 existierten. Es deckt alles ab, von den Grundlagen bis hin zu den fortschrittlichsten Metaprogrammierungen für Schablonen, und erläutert jedes Detail (wie konzeptuell und wie sie implementiert werden) sowie viele häufige Fallstricke. Hat hervorragende Zusammenfassungen der One Definition Rule (ODR) und Überlastauflösung in den Anhängen. Eine zweite Ausgabe zu C ++ 11, C ++ 14 und C ++ 17 wurde bereits veröffentlicht. [Review]

Erweitert

  • Modernes C ++ - Design (Andrei Alexandrescu) Ein wegweisendes Buch über fortgeschrittene generische Programmiertechniken. Einführung in richtlinienbasiertes Design, Typenlisten und grundlegende generische Programmiersprachen. Anschließend wird erläutert, wie viele nützliche Entwurfsmuster (einschließlich kleiner Objektzuordnungen, Funktionen, Fabriken, Besucher und Multimethoden) effizient, modular und sauber unter Verwendung der generischen Programmierung implementiert werden können . [Review]

  • Metaprogrammierung von C ++ - Vorlagen (David Abrahams und Aleksey Gurtovoy)

  • C ++ Concurrency In Action (Anthony Williams) Ein Buch zur Unterstützung der C ++ 11-Parallelität, einschließlich der Thread-Bibliothek, der Atomics-Bibliothek, des C ++ - Speichermodells, Sperren und Mutexen sowie Fragen zum Entwerfen und Debuggen von Multithread-Anwendungen.

  • Fortgeschrittene C ++ - Metaprogrammierung (Davide Di Gennaro) Ein Handbuch zu TMP-Techniken vor C ++ 11, das sich mehr auf die Praxis als auf die Theorie konzentriert. Es gibt eine Unmenge von Ausschnitten in diesem Buch, von denen einige durch Typmerkmale überholt sind, aber die Techniken sind dennoch nützlich zu wissen. Wenn Sie die schrullige Formatierung / Bearbeitung in Kauf nehmen können, ist es einfacher zu lesen als Alexandrescu und lohnenswerter. Für erfahrene Entwickler besteht eine gute Chance, dass Sie etwas aus einer dunklen Ecke von C ++ (einer Eigenart) herausgreifen, die normalerweise nur durch umfangreiche Erfahrung entsteht.

Referenzstil - Alle Ebenen

  • Die C ++ - Programmiersprache (Bjarne Stroustrup) ( aktualisiert für C ++ 11 ) Die klassische Einführung in C ++ durch den Ersteller. Parallel zum klassischen K & R liest sich dies in der Tat sehr und umfasst alles von der Kernsprache über die Standardbibliothek, über Programmierparadigmen bis hin zur Philosophie der Sprache. [Review] Anmerkung: Alle Versionen des C ++ - Standards werden in dieser Frage nachverfolgt: Wo finde ich den aktuellen C ++ - Standard?

  • C ++ - Standardbibliothek - Tutorial und Referenz (Nicolai Josuttis) ( aktualisiert für C ++ 11 ) Die Einführung und Referenz für die C ++ - Standardbibliothek. Die zweite Ausgabe (veröffentlicht am 9. April 2012) umfasst C ++ 11. [Review]

  • Die C ++ IO-Streams und Locales (Angelika Langer und Klaus Kreft) Zu diesem Buch gibt es sehr wenig zu sagen, außer, wenn Sie etwas über Streams und Locales wissen möchten, dann ist dies der richtige Ort, um endgültige Antworten zu finden. [Review]

C ++ 11/14/17 /… Referenzen:

  • Der Standard C ++ 11/14/17 (INCITS / ISO / IEC 14882: 2011/2014/2017) Dies ist natürlich der letzte Schiedsrichter für alles, was C ++ ist oder nicht. Seien Sie sich jedoch bewusst, dass es nur als Referenz für erfahrene Benutzer gedacht ist, die viel Zeit und Mühe auf ihr Verständnis ausgeben möchten. Der C ++ 17-Standard wird in elektronischer Form für 198 Schweizer Franken veröffentlicht.

  • Der C ++ 17-Standard ist verfügbar, aber scheinbar nicht in einer kostengünstigen Form - 17 kostet er 198 Schweizer Franken (etwa 200 US-Dollar). Für die meisten Menschen ist der endgültige Entwurf vor der Standardisierung mehr als ausreichend (und kostenlos). Viele werden einen noch neueren Entwurf vorziehen und neue Funktionen dokumentieren, die wahrscheinlich in C ++ 20 enthalten sind.

  • Überblick über das neue C ++ (C ++ 11/14 ) (nur PDF) (Scott Meyers) ( aktualisiert für C ++ 1y / C ++ 14 ) Dies ist das Präsentationsmaterial (Folien und einige Vorlesungsunterlagen) eines Tagesschulungskurs angeboten von Scott Meyers, einem auf C ++ hoch angesehenen Autor. Obwohl die Liste der Artikel kurz ist, ist die Qualität hoch.

  • Die C ++ - Kernrichtlinien (C ++ 11/14/17 /…) (herausgegeben von Bjarne Stroustrup und Herb Sutter) sind ein sich entwickelndes Online-Dokument, das aus einer Reihe von Richtlinien für die Verwendung moderner C ++ - Quellen besteht. Die Richtlinien konzentrieren sich auf relativ übergeordnete Themen wie Schnittstellen, Ressourcenverwaltung, Speicherverwaltung und Parallelität, die sich auf die Anwendungsarchitektur und das Bibliotheksdesign auswirken. Das Projekt wurde auf der CppCon'15 von Bjarne Stroustrup und anderen angekündigt und begrüßt Beiträge der Community. Die meisten Richtlinien werden durch eine Begründung und Beispiele sowie Diskussionen über mögliche Werkzeugunterstützung ergänzt. Viele Regeln sind speziell dafür ausgelegt, von statischen Analysewerkzeugen automatisch überprüft zu werden.

  • Die C ++ Super-FAQ (Marshall Cline, Bjarne Stroustrup und andere) ist ein Bestreben der Standard C ++ Foundation, die zuvor von Marshall Cline und Bjarne Stroustrup individuell gepflegten C ++ - FAQs zu vereinheitlichen und neue Beiträge einzubeziehen. Die Artikel befassen sich meist mit Problemen auf mittlerer Ebene und werden oft mit einem humorvollen Ton geschrieben. Möglicherweise sind noch nicht alle Elemente mit der neuesten Ausgabe des C ++ - Standards vollständig auf dem neuesten Stand.

  • cppreference.com (C ++ 03/11/14/17 /…) (initiiert von Nate Kohl) ist ein Wiki, das die grundlegenden Kernsprachenmerkmale zusammenfasst und eine umfassende Dokumentation der C ++ - Standardbibliothek enthält. Die Dokumentation ist sehr präzise, ​​jedoch einfacher zu lesen als das offizielle Standarddokument und bietet aufgrund seines Wiki-Charakters eine bessere Navigation. Das Projekt dokumentiert alle Versionen des C ++ - Standards und die Site ermöglicht das Filtern der Anzeige nach einer bestimmten Version. Das Projekt wurde von Nate Kohl auf der CppCon'14 vorgestellt .

Klassiker / Älter

Hinweis: Einige in diesen Büchern enthaltene Informationen sind möglicherweise nicht auf dem neuesten Stand oder gelten nicht mehr als bewährte Methode.

  • Das Design und die Entwicklung von C ++ (Bjarne Stroustrup) Wenn Sie wissen wollen, warum die Sprache so ist, wie sie ist, dann finden Sie in diesem Buch Antworten. Dies umfasst alles vor der Standardisierung von C ++.

  • Überlegungen zu C ++ - (Andrew Koenig und Barbara Moo) [Review]

  • Fortgeschrittene C ++ - Programmierstile und -Idiome (James Coplien) Als Vorläufer der Musterbewegung werden viele C ++ - spezifische "Idiome" beschrieben. Es ist auf jeden Fall ein sehr gutes Buch und vielleicht noch eine Lektüre wert, wenn Sie sich die Zeit nehmen können, aber mit dem aktuellen C ++ recht alt und nicht auf dem neuesten Stand.

  • Großes C ++ - Softwaredesign (John Lakos) Lakos erläutert Techniken zur Verwaltung sehr großer C ++ - Softwareprojekte. Sicherlich eine gute Lektüre, wenn es nur aktuell wäre. Es wurde lange vor C ++ 98 geschrieben und lässt viele Features (z. B. Namensräume) vermissen, die für große Projekte wichtig sind. Wenn Sie in einem großen C ++ - Softwareprojekt arbeiten müssen, möchten Sie es vielleicht lesen, obwohl Sie mehr als ein Salz Salz mitnehmen müssen. Der erste Band einer Neuauflage wird 2018 erwartet .

  • Innerhalb des C ++ - Objektmodells (Stanley Lippman) Wenn Sie wissen möchten, wie virtuelle Elementfunktionen allgemein implementiert werden und wie Basisobjekte in einem Szenario mit mehreren Vererbungen allgemein im Speicher abgelegt werden und wie sich dies auf die Leistung auswirkt, sollten Sie dies tun gründliche Diskussionen über solche Themen finden.

  • Das kommentierte C ++ - Referenzhandbuch (Bjarne Stroustrup, Margaret A. Ellis) Dieses Buch ist ziemlich veraltet, da es die C ++ 2.0-Version von 1989 untersucht - Vorlagen, Ausnahmen, Namespaces und neue Besetzungen wurden noch nicht eingeführt. Das Buch durchläuft jedoch den gesamten C ++ - Standard der Zeit und erläutert die Gründe, die möglichen Implementierungen und Merkmale der Sprache. Dies ist kein Buch zum Erlernen von Programmierprinzipien und -mustern in C ++, sondern zum Verstehen aller Aspekte der C ++ - Sprache.

  • Denken in C ++ (Bruce Eckel, 2. Auflage, 2000). Zwei Bände; ist eine Reihe von Einführungsbüchern. Downloads: Band 1 , Band 2 . Leider sind sie durch eine Reihe trivialer Fehler beeinträchtigt (z. B. die Behauptung, dass temporäre const automatisch const ), ohne offizielle Errata-Liste. Eine teilweise Errata-Liste von Drittanbietern ist unter http://www.computersciencelab.com/Eckel.htm verfügbar, wird aber offenbar nicht gepflegt.

  • Wissenschaft und Technik C ++: Einführung in fortgeschrittene Techniken und Beispiele (John Barton und Lee Nackman) Es ist ein umfassendes und sehr detailliertes Buch, in dem versucht wurde, alle in C ++ verfügbaren Funktionen im Zusammenhang mit numerischen Methoden zu erklären und zu nutzen. Zu dieser Zeit wurden mehrere neue Techniken eingeführt, beispielsweise das Curiously Recurring Template Pattern (CRTP, auch Barton-Nackman-Trick genannt). Es war Pionier bei verschiedenen Techniken wie der Dimensionsanalyse und der automatischen Differenzierung. Das Programm enthielt viele kompilierbare und nützliche Codes, die vom Ausdrucks-Parser bis zum Lapack-Wrapper reichen. Der Code ist noch immer hier verfügbar: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934 . Leider sind die Bücher in Bezug auf Stil und C ++ - Funktionen etwas veraltet, jedoch war dies zu der Zeit (1994, vor dem STL) ein unglaublicher Kraftakt. Die Kapitel über die Vererbung von Dynamik sind etwas kompliziert zu verstehen und nicht sehr nützlich. Eine aktualisierte Version dieses klassischen Buches, die Bewegungssemantik und die aus der STL-Lektion gewonnenen Lektionen enthält, wäre sehr schön.







c++ constructor