Condividi tramite


La conversione viene eseguita (C++)

Nella conversione dai costruttori, descritti nella sezione precedente, gli oggetti di un tipo possono essere convertiti in modo implicito a un particolare tipo della classe.In questa sezione vengono descritti i metodi da cui è possibile immettere le conversioni esplicite da un tipo specifico della classe in un altro tipo.La conversione dal tipo della classe fa spesso utilizzando le funzioni di conversione.Le funzioni di conversione utilizzare la seguente sintassi:

Grammatica

  • conversione-funzione-nome:
    operatore conversione-tipo-nome ()

  • conversione-tipo-nome:
    stampante-operatore dell'tipo-identificatore-elencoscegliere

Nell'esempio seguente viene specificata una funzione di conversione di tipo converte Money per digitare double:

// spec1_conversion_functions1.cpp
struct Money {
   operator double() { return _amount; }

private:
    double _amount;
};

int main() {
   Money Account;
   double CashOnHand = Account;
}

l'inizializzazione di CashOnHand con Account causa una conversione di tipo Account per digitare double.

Le funzioni di conversione vengono definite “operatori di cast„ perché (con i costruttori) sono le funzioni chiamate quando utilizzare un cast.Nell'esempio seguente viene utilizzato un cast, o una conversione esplicita, per visualizzare il valore corrente di un oggetto di tipo Money:

cout << (double)Account << endl;

Le funzioni di conversione vengono ereditate nelle classi derivate.Gli operatori di conversione nascondono solo gli operatori di conversione della classe base che convertono esattamente allo stesso tipo.Pertanto, un oggetto definito dall'utente operatore int la funzione non nasconde un oggetto definito dall'utente operatore breve funzione in una classe base.

Solo una funzione definita dall'utente di conversione applica quando esegue le conversioni implicite.Se non c " è funzione definita esplicitamente di conversione, il compilatore non trova i tipi intermedi in cui un oggetto possa essere convertito.

Se una conversione è obbligatoria che le cause un'ambiguità, un errore viene generata un'eccezione.Le ambiguità si verificano quando più conversioni definite dall'utente è disponibile o quando una conversione definita dall'utente e una conversione incorporata esiste.

Esempio

Nell'esempio seguente viene illustrata la dichiarazione di classe con un'ambiguità potenziale:

// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>

struct String {
   // Define constructor that converts from type char *.
   String( char *szBuffer ) {
      strcpy_s( _text, szBuffer );
   }

   // Define conversion to type char *.
   operator char *() {
      return _text;
   }

   int operator==( const String &s )  {
      return !strcmp( _text, s._text );
   }

private:
   char _text[80];
};

int main() {
   String s( "abcd\0" );
   char *ch = "efgh";

   // Cause the compiler to select a conversion.
   return s == ch; // C2666
}

Nell'espressione s == ch, il compilatore non dispone di due opzioni e modalità di determinazione del quale è corretto.È possibile convertire ch a un oggetto di tipo String utilizzando il costruttore e quindi eseguire il confronto utilizzando definito dall'utente operator==.O possibile convertire s a un puntatore di tipo char * utilizzo di conversione la funzione e quindi esegue un confronto dei puntatori.

Poiché nessuna delle due scelta “più corretta„ dall'altro, il compilatore non può determinare il significato dell'espressione di confronto e genera un errore.

Vedere anche

Riferimenti

Conversioni