Condivisione della tecnologia

Introduzione alle nuove funzionalità di C 11-Parte 2

2024-07-08

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

11. Detrazione automatica del tipo

(1) Derivazione automatica di tipo Auto
auto deduce automaticamente il tipo della variabile
auto non rappresenta un tipo effettivo, è solo un segnaposto per una dichiarazione di tipo
Auto non è onnipotente e può essere dedotto in qualsiasi scenario. Le variabili dichiarate utilizzando auto devono essere inizializzate per consentire al compilatore di dedurre il suo tipo effettivo e convertire auto nel tipo effettivo in fase di compilazione.
Quando la variabile non è un puntatore o un riferimento, il risultato della derivazione non manterrà le parole chiave const e volatile; quando la variabile è un puntatore o un riferimento, il risultato della derivazione manterrà le parole chiave const e volatile;
Scenari in cui non è possibile utilizzare la modalità automatica:
1.auto non può essere utilizzato come parametro di funzione, perché utilizzare auto come parametro formale equivale a non inizializzare la variabile e auto non può essere esportato;
2. Non può essere utilizzato per inizializzare variabili membro non statiche di una classe, perché le variabili membro non statiche appartengono a oggetti e il tipo dell'oggetto non è noto finché non viene creato;
3. Non è possibile utilizzare la parola chiave auto per definire un array;
4. Auto non può essere utilizzato per derivare i parametri del modello;
Scenari di utilizzo consigliati per l'auto:
1. Utilizzato per l'attraversamento di contenitori STL;
2. Utilizzato per la programmazione generica;
(2) derivazione del tipo decltype
A volte non è necessario o non è possibile definire variabili, ma si desidera ottenere un determinato tipo. È possibile utilizzare decltype per dedurre il tipo di un'espressione durante la compilazione, ad esempio: int x=18; ;Cioè, dedurre il tipo da a a x
Regole di derivazione:
1. L'espressione è una variabile ordinaria, un'espressione ordinaria o un'espressione di classe temporale e il tipo dedotto utilizzando decltype è coerente con il tipo dell'espressione;
2. L'espressione è una funzione e il tipo dedotto utilizzando decltype è coerente con il valore restituito dalla funzione (se il valore restituito viene modificato con const, qualificatori volatili, i qualificatori vengono ignorati);
3. L'espressione è un lvalue o racchiusa in () e decltype viene utilizzato per dedurre un riferimento al tipo di espressione (se il valore restituito viene modificato con qualificatori const o volatile, i qualificatori vengono ignorati);
Scenari applicativi di decltype:
1. Utilizzato principalmente nella programmazione generica, perché esiste un gran numero di tipi incerti nella programmazione generica;

12.uso finale

final viene utilizzato per impedire che una determinata classe venga ereditata o che una determinata funzione virtuale venga sovrascritta.
Quando final modifica una funzione, puoi modificare solo le funzioni virtuali e la parola chiave final deve essere posizionata dopo la classe o la funzione. Quando una funzione virtuale viene modificata con final, può impedire alla sottoclasse di sovrascrivere la funzione virtuale della classe genitore.
Quando final modifica una classe, scrivi final dopo il nome della classe, indicando che questa classe non può più essere ereditata, cioè che questa classe non ha più classi derivate.

13.utilizzando

Ruolo iniziale: utilizzato per dichiarare gli spazi dei nomi. L'uso degli spazi dei nomi può prevenire conflitti di denominazione. Le sottoclassi utente chiamano metodi con lo stesso nome della classe genitore nascosta;
Nuova funzione: definire un alias di un tipo Notare che using in realtà fornisce solo un alias al tipo originale, anziché definire un nuovo tipo. Come utilizzare: using new type = old type, come: using my_int = int;
Usare using invece di typedef per definire i puntatori a funzione rende il codice più facile da leggere All'inizio, typedef veniva utilizzato per definire i puntatori a funzione, come: typedef int (.func)(int, string);Utilizzare invece la definizione using: using func = int()(int, stringa);
Using è possibile specificare gli alias per i modelli, ma typedef no

14. Staffa ad angolo retto

I primi compilatori C interpretavano due parentesi uncinate come operatori di spostamento a destra
Tra le nuove funzionalità, le regole di analisi del compilatore sono state migliorate per analizzare il più possibile più parentesi uncinate destre in terminatori di parametri del modello.

15.uso prioritario

L'override viene utilizzato per garantire che la funzione da sovrascrivere nella classe derivata abbia la stessa firma della corrispondente funzione virtuale della classe base e indica inoltre chiaramente che la funzione della classe base verrà sovrascritta.
L'override viene scritto dopo la funzione, affermando esplicitamente che la funzione è stata sovrascritta e il compilatore controllerà il tipo della funzione e la funzione virtuale della classe genitore.

16. Tipo di valore restituito suffisso

Scrivere il tipo del valore restituito dalla funzione dopo il corpo della dichiarazione della funzione, auto func (parametro 1, parametro 2,...) -