Technologieaustausch

Einführung in neue Funktionen in C 11-Teil 2

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

11. Automatischer Typabzug

(1) Automatische Ableitung des Autotyps
auto leitet automatisch den Typ der Variablen ab
auto stellt keinen tatsächlichen Typ dar, sondern ist lediglich ein Platzhalter für eine Typdeklaration
Auto ist nicht allmächtig und kann in jedem Szenario abgeleitet werden. Mit auto deklarierte Variablen müssen initialisiert werden, damit der Compiler ihren tatsächlichen Typ ableiten und auto zur Kompilierungszeit in den tatsächlichen Typ konvertieren kann.
Wenn die Variable kein Zeiger oder Verweis ist, behält das Ableitungsergebnis die Schlüsselwörter const und volatile nicht bei. Wenn die Variable ein Zeiger oder eine Referenz ist, behält das Ableitungsergebnis die Schlüsselwörter const und volatile bei.
Szenarien, in denen Auto nicht verwendet werden kann:
1.auto kann nicht als Funktionsparameter verwendet werden, da die Verwendung von auto als formaler Parameter dem Nichtinitialisieren der Variablen entspricht und auto nicht exportiert werden kann.
2. Es kann nicht zum Initialisieren nicht statischer Mitgliedsvariablen einer Klasse verwendet werden, da nicht statische Mitgliedsvariablen zu Objekten gehören und der Typ des Objekts erst bekannt ist, wenn es erstellt wird.
3. Sie können das Schlüsselwort auto nicht zum Definieren eines Arrays verwenden.
4. Auto kann nicht zum Ableiten von Vorlagenparametern verwendet werden.
Empfohlene Einsatzszenarien für Auto:
1. Wird zum Durchlaufen von STL-Containern verwendet.
2. Wird für die generische Programmierung verwendet;
(2) Ableitung des Decltype-Typs
Manchmal müssen oder können Sie keine Variablen definieren, möchten aber einen bestimmten Typ erhalten. Sie können decltype verwenden, um den Typ eines Ausdrucks während der Kompilierung abzuleiten, z. B.: int x=18; decltype(x) a=x ;Das heißt, leiten Sie den Typ von a durch x ab
Ableitungsregeln:
1. Der Ausdruck ist eine gewöhnliche Variable, ein gewöhnlicher Ausdruck oder ein Zeitklassenausdruck, und der mit decltype abgeleitete Typ stimmt mit dem Typ des Ausdrucks überein.
2. Der Ausdruck ist eine Funktion und der mit decltype abgeleitete Typ stimmt mit dem Rückgabewert der Funktion überein (wenn der Rückgabewert mit const und flüchtigen Qualifikationsmerkmalen geändert wird, werden die Qualifikationsmerkmale ignoriert).
3. Der Ausdruck ist ein L-Wert oder in () eingeschlossen, und decltype wird verwendet, um einen Verweis auf den Ausdruckstyp abzuleiten (wenn der Rückgabewert mit const- oder volatile-Qualifizierern geändert wird, werden die Qualifizierer ignoriert);
Anwendungsszenarien von decltype:
1. Wird hauptsächlich in der generischen Programmierung verwendet, da es in der generischen Programmierung eine große Anzahl unsicherer Typen gibt.

12. Endgültige Verwendung

final wird verwendet, um die Vererbung einer bestimmten Klasse oder das Überschreiben einer bestimmten virtuellen Funktion zu verhindern.
Wenn final eine Funktion ändert, können Sie nur virtuelle Funktionen ändern und das Schlüsselwort final muss nach der Klasse oder Funktion platziert werden. Wenn eine virtuelle Funktion mit „final“ geändert wird, kann verhindert werden, dass die Unterklasse die virtuelle Funktion der übergeordneten Klasse überschreibt.
Wenn final eine Klasse ändert, schreiben Sie final nach dem Klassennamen, um anzugeben, dass diese Klasse nicht mehr vererbt werden darf, dh diese Klasse hat keine abgeleiteten Klassen mehr.

13.Verwendung

Frühe Rolle: Wird zum Deklarieren von Namespaces verwendet, um Namenskonflikte zu vermeiden. Benutzerunterklassen rufen Methoden mit demselben Namen wie die ausgeblendete übergeordnete Klasse auf.
Neue Funktion: Definieren Sie einen Alias ​​eines Typs. Beachten Sie, dass die Verwendung tatsächlich nur einen Alias ​​für den ursprünglichen Typ ergibt, anstatt einen neuen Typ zu definieren, z. B.: using my_int = int;
Die Verwendung von using anstelle von typedef zum Definieren von Funktionszeigern erleichtert das Lesen des Codes. In der Anfangszeit wurde typedef zum Definieren von Funktionszeigern verwendet, z. B.: typedef int (.func)(int, string);Verwenden Sie stattdessen using definition: using func = int()(int, Zeichenfolge);
Using kann Aliase für Vorlagen angeben, typedef jedoch nicht

14. Rechtwinklige Halterung

Frühe C-Compiler interpretierten zwei rechte spitze Klammern als Rechtsverschiebungsoperatoren
Zu den neuen Funktionen gehört die Verbesserung der Parsing-Regeln des Compilers, um mehrere rechte spitze Klammern so weit wie möglich in Vorlagenparameter-Abschlusszeichen zu parsen.

15. Verwendung außer Kraft setzen

Überschreiben wird verwendet, um sicherzustellen, dass die zu überschreibende Funktion in der abgeleiteten Klasse dieselbe Signatur wie die entsprechende virtuelle Funktion der Basisklasse hat, und zeigt außerdem deutlich an, dass die Funktion der Basisklasse überschrieben wird.
Override wird nach der Funktion geschrieben und gibt explizit an, dass die Funktion überschrieben wird. Der Compiler überprüft den Typ der Funktion und die virtuelle Funktion der übergeordneten Klasse.

16. Postfix des Rückgabewerttyps

Schreiben Sie den Rückgabewerttyp der Funktion nach dem Funktionsdeklarationskörper, auto func (Parameter 1, Parameter 2,...) -