C++/CLI: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (3), </source> → </syntaxhighlight> (3), typos fixed: n . → n. (10) |
Funzionalità collegamenti suggeriti: 1 collegamento inserito. |
||
(3 versioni intermedie di 3 utenti non mostrate) | |||
Riga 1:
{{T|inglese|informatica|dicembre 2016}}
'''C++/CLI''' ([[C++]] modificato per la [[Common Language Infrastructure]]) è un [[linguaggio di programmazione]] specifico creato da Microsoft e destinato a sostituire le [[Managed extensions per C++]]. Si tratta di una revisione completa che mira a semplificare la vecchia sintassi del Managed C++, ora deprecato.<ref>[https://msdn.microsoft.com/en-us/library/b23b94s7.aspx Managed Extensions for C++ Syntax Upgrade Checklist - MSDN Library]</ref> C++/CLI è stato standardizzato da [[ECMA International|
== Cambiamenti sintattici ==
C++/CLI è concepito come un linguaggio a sé stante, (ad esempio con un nuovo insieme di parole chiave), a differenza del Managed C++ (MC++), che è piuttosto un ''superset'' del C++ in cui le parole chiave non standard erano
Molte sintassi in conflitto, come le versioni multiple dell'operatore <code>new()</code> in MC++, sono state separate: nel C++/CLI e in. NET i tipi di riferimento vengono creati con la nuova parola chiave <code>gcnew</code> (che sta per ''[[Garbage collection|garbage collected]] new ()''). Inoltre, C++/CLI ha introdotto il concetto dei generici da. NET (simile, per gli scopi più comuni, ai template standard C++, ma molto diversi nella loro implementazione).
Riga 15:
Un '''rintracciamento di riferimenti''' (anche detto tracking references) in C++/CLI è un handle di una variabile passata per riferimento. Come concetto è simile all'utilizzo di <code>*&</code> (riferimento a un puntatore) nel C++ classico, e (nella dichiarazione di funzioni) corrisponde alla parola chiave <code>ref</code> applicata a tipi in C#, o <code> ByRef </code> in. NET. Per indicare un rintracciamento di riferimento il C++/CLI utilizza come sintassi <code>^%</code>.
Un esempio sull'utilizzo del ''rintracciamento di riferimenti'' viene mostrato nel codice che segue. Rimpiazzare il rintracciamento di riferimenti con un handle regolare lascerebbe l'array di stringhe risultante con 10 stringhe handles non inizializzate, in quanto sarebbero impostate solamente le stringhe handle nell'array, dato che vengono passate per valore e non per riferimento.
<syntaxhighlight lang=Cpp>
Riga 31:
</syntaxhighlight>
Si noti che in C# tale
===Finalizzatori e variabili automatiche===
Un'ulteriore differenza con C++/CLI è l'introduzione sintattica di [[finalizzatori]] <code>!ClassName</code>, un tipo speciale di distruttore non deterministico eseguito come parte della [[Garbage collection|garbage collection routine]]. La sintassi dei distruttori classica del C++, quale <code>~ClassName()</code>, esiste anche per oggetti gestiti, e riflette meglio la semantica "tradizionale" del C++ di una distruzione deterministica (di fatto i distruttori possono essere invocati a livello di codice mediante <code>
Nel paradigma
<syntaxhighlight lang=Cpp>
Riga 62:
===Operatore di overloading===
Un operatore di [[overloading]] (o di sovraccarico) funziona esattamente come nel C++ classico. Ogni * diventa un ^, ogni & diventa un %, con il resto della sintassi completamente invariato, con un'eccezione: per le classi. NET, l'operatore di overloading è instanziabile e invocabile non solo per le classi stesse, ma anche per i riferimenti alle classi. Tale peculiarità è necessaria per dare a ''ref class'' la semantica per l'operatore di overloading che le ''ref classes'' .NET si aspettano (Al contrario, questo significa anche che le ref classes presenti nel framework. NET fanno riferimento operatori di overloading, spesso implicitamente implementati in C++/CLI.
Per esempio, facendo un paragone tra due Stringhe di riferimento (String^) mediante l'operatore == restituirà "true" (vero) a prescindere. Essendo l'operatore di overloading statico, effettuare un cast a Object^ rimuove la semantica di overloading.
|