- Tipi Integer
- Tipi Reali (double, float)
- Numero complesso (complex)
- Tipo Stringa
- Strutture, Classi e Interfacce
- Oggetto Array Dinamico
- Matrices and vectors
- Typecasting
- Tipo Void e Costante NULL
- Tipi definiti dall'utente
- Puntatori agli Oggetti
- Riferimento. Il Modifier & e la parola chiave this
Typecasting
Casting di Tipi Numerici
Spesso si verifica la necessità di convertire un tipo numerico in un altro. Non tutti i tipi numerici possono essere convertiti in altri. Ecco lo schema di casting consentito:
Le linee continue con le frecce indicano le modifiche che vengono eseguite quasi senza alcuna perdita di informazioni. Al posto del tipo char, può essere usato il tipo bool (entrambi prendono 1 byte di memoria), al posto del tipo int, può essere utilizzato il tipo color (4 byte), al posto del tipo long, può essere utilizzato il tipo datetime (prende 8 byte). Le quattro linee tratteggiate grigie, anch'esse a freccia, denotano conversioni, quando la perdita di precisione può verificarsi. Ad esempio, il numero di cifre nel numero intero pari a 123456789 (int) è superiore al numero di cifre che possono essere rappresentate da un float.
int n=123456789;
|
Un numero convertito in float ha lo stesso ordine, ma è meno accurato. Le conversioni, inversamente alle frecce nere, possono essere eseguite con eventuale perdita di dati. Conversioni tra char ed uchar, short ed ushort, int ed uint, long ed ulong (conversioni da entrambe le parti), possono portare alla perdita di dati.
Come risultato di conversione di valori in virgola mobile verso il tipo intero, la parte frazionaria viene sempre eliminata. Se si desidera arrotondare un float al numero intero più vicino (che in molti casi è più utile), è necessario utilizzare MathRound ().
Esempio:
// --- Accelerazione gravitazionale
|
Se due valori vengono combinati da un operatore binario, prima dell'esecuzione dell'operazione l'operando di tipo inferiore viene convertito nel tipo superiore secondo la priorità data nel seguente schema:
I tipi di dati char, uchar, short, ed ushort incondizionatamente vengono convertiti nel tipo int.
Esempi:
char c1=3;
|
L'espressione calcolata si compone di due operazioni. Nel primo esempio, la variabile c1 del tipo char viene convertita in una variabile temporanea di tipo int, perché il secondo operando nell'operazione di divisione, la costante 2, è del tipo superiore int. Come risultato della divisione intera 3/2 si ottiene il valore 1, che è di tipo int.
Nella seconda operazione del primo esempio, il secondo operando è la costante 0.3, che è di tipo double, quindi il risultato della prima operazione viene convertito in una variabile temporanea di tipo double con il valore di 1.0 .
Nel secondo esempio la variabile di tipo char c1 viene convertita in una variabile temporanea di tipo double, perché il secondo operando nell'operazione di divisione, la costante 2.0, è di tipo double; non vengono effettuate altre conversioni.
Typecasting di Tipi Numerici
Nelle espressioni del linguaggio MQL5 entrambi il typecasting esplicito ed implicito, può essere utilizzato. Il typecasting esplicito è scritto come segue:
var_1 = (tipo)var_2; |
Un risultato di un'espressione o di esecuzione di una funzione può essere utilizzato come variabile var_2. La registrazione funzionale del typecasting esplicito è anche possibile:
var_1 = tipo(var_2); |
Consideriamo un typecasting esplicito sulla base del primo esempio.
//--- Terzo esempio
|
Prima che l'operazione di divisione venga eseguita, la variabile c1 è esplicitamente 'castata'(_* neologismo, da cast/casting) al tipo double. Ora il numero costante integer 2 è castato al valore 2.0 valore di tipo double, perché come risultato della conversione del primo operando ha preso il tipo double. Infatti, il typecasting esplicito è un'operazione unaria.
Inoltre, quando si cerca di castare i tipi, il risultato può andare oltre il range permissibile. In questo caso, avviene un troncamento. Ad esempio:
char c;
|
Prima che le operazioni (ad eccezione di quelle assegnazione) vengano eseguite, i dati vengono convertiti nel tipo massima priorità. Prima che vengano eseguite le operazioni di assegnazione, i dati vengono castati nel tipo target(_*di destinazione).
Esempi:
int i=1/2; // nessun casting del tipo, il risultato è 0
|
Durante la conversione di tipo long/ulong in double, la precisione può venir persa nel caso in cui il valore integer sia maggiore di 9223372036854774784 o minore di -9223372036854774784.
voidOnStart()
|
Typecasting per il tipo String
Il tipo stringa ha la priorità più alta tra i tipi semplici. Pertanto, se uno degli operandi di un'operazione è di tipo stringa, il secondo operando sarà castato in una stringa automaticamente. Si noti che per una stringa, è possibile una singola operazione di addizione diadica a doppio-luogo. Il casting esplicito di stringa in un qualsiasi tipo numerico, è consentito.
Esempi:
string s1=1.0/8; // l'espressione viene castata al tipo double,
|
Typecasting di Puntatori di Classe Base a Puntatori di Classi Derivate
Oggetti di classi aperte generate possono anche essere visti come oggetti della classe base corrispondente. Questo porta ad alcune conseguenze interessanti. Per esempio, nonostante il fatto che gli oggetti di diverse classi, generati da una singola classe di base, possono differire significativamente l'uno dall'altro, possiamo creare una lista collegata (List) di essi, giacchè li vediamo come oggetti del tipo di base. Ma il contrario non è vero: gli oggetti della classe base non sono automaticamente gli oggetti di una classe derivata.
È possibile utilizzare il casting esplicito per convertire i puntatori della classe base in puntatori di una classe derivata. Ma si deve essere pienamente fiduciosi nella ammissibilità di tale trasformazione, perché altrimenti un errore runtime critico si verificherà e il programma MQL5 sarà interrotto.
Dynamic typecasting using dynamic_cast operator #
Dynamic typecasting is performed using dynamic_cast operator that can be applied only to pointers to classes. Type validation is performed at runtime. This means that the compiler does not check the data type applied for typecasting when dynamic_cast operator is used. If a pointer is converted to a data type which is not the actual type of an object, the result is NULL.
dynamic_cast <type-id> ( expression ) |
The type-id parameter in angle brackets should point to a previously defined class type. Unlike C++, expression operand type can be of any value except for void.
Example:
class CBar { };
|
Vedi anche