2010-09-28 9 views
23

Qual è la funzione "operator int" qui sotto? Che cosa fa?Che cos'è una funzione "operatore int"?

+0

Quale codice in grassetto? Altrimenti è fondamentalmente un wrapper per 'int' con conversione a' int' e operatore '++'. –

+3

Guardando all'origine del post originale, "operator int()" dovrebbe essere il codice in grassetto. –

+6

Se potessi, voterei onestamente per riaprirlo. La domanda originale era formattata male, ma aveva un segmento di codice chiaramente in grassetto. Una modifica successiva (non dell'OP) era ciò che rendeva il codice non audace e quindi faceva sembrare la domanda incoerente. – eldarerathis

risposta

24

Il codice in grassetto è un operatore di conversione. (AKA cast operator)

Ti dà un modo per convertire dal vostro tipo personalizzato INT ad un altro tipo (in questo caso, int) senza dover chiamare una funzione di conversione speciale in modo esplicito.

Per esempio, con l'operatore convertito, questo codice verrà compilato:

INT i(1234); 
int i_2 = i; // this will implicitly call INT::operator int() 

senza che l'operatore convertito, il codice di cui sopra non viene compilato, e si dovrebbe fare qualcosa di diverso per passare da un INT un int, come ad esempio:

INT i(1234); 
int i_2 = i.a; // this wont compile because a is private 
4

Sembra che faccia una classe INT che si comporta un po 'come il normale int, solo che alcuni altri operatori non sono ancora definiti.

Si tratta di un problema di compiti a casa?

3

Sembra che si tratti di una domanda da una classe, quindi ti invito a controllare la documentazione su come creare una classe.

class Foo 
{ 
public 
    Foo() {} // Constructor 

    Foo operator++ {} // Operation ++ on foo like: 
    // Foo foo; 
    // foo++; 
}; 
15

operator int() è un operatore conversione, che permette questa classe per essere utilizzato al posto di un int. Se un oggetto di questo tipo viene utilizzato in un luogo in cui è previsto un int (o un altro tipo numerico), questo codice verrà utilizzato per ottenere un valore del tipo corretto.

Ad esempio:

int i(1); 
INT I(2); // Initialised with constructor; I.a == 2 
i = I; // I is converted to an int using `operator int()`, returning 2. 
4

Per prima cosa:

$ 12.3.1/1 - "Un costruttore ha dichiarato senza la funzione-specificatore esplicita specifica una conversione da i tipi di i suoi parametri al tipo della sua classe.Questo costruttore è chiamato costruttore di conversione. "

Nel proprio esempio, INT è una classe definita dall'utente che ha un costruttore di conversione da "int".

Pertanto il codice seguente è ben formata:

INT i(1024);  // direct initialization syntax 

Ciò significa che è possibile ottenere un oggetto INT da un numero intero. Tuttavia, cosa si fa se l'oggetto INT deve essere riconvertito in un numero intero? Transitività?

Si può dire che l'INT classe può fornire una funzione membro per restituire il membro integer incapsulato

int x = i.geta(); 

Questo però non è molto intuitivo e non è un metodo standard.Inoltre non è intuitivo quando si tratta di come i tipi built-in funzionano in tali situazioni.

int z = 0; 
int y1 = z; // copy initialization or 
int y2(z); // direct initialization 
double d = (int)z; // explicit cast 

Perciò la norma ammette tale standardizzazione e l'intuitività di convertire tipi definiti dall'utente dicendo:

$ 12,3/2 - "Una funzione membro di una classe X non avere parametri con un nome della forma [...]

operatore di conversione di tipo-id

[ ...] specifica una conversione da X al tipo specificato dall'ID di conversione . Tali funzioni sono chiamate funzioni di conversione. Non è possibile specificare il tipo di ritorno . Se una funzione di conversione è una funzione membro, il tipo (8.3.5) della funzione di conversione (funzione di conversione) non accetta il parametro restituendo ID tipo di conversione ".

Questo rende tutti i seguenti ben formate e mantiene l'armonia con il modo tipi built-in funzionano è

int y1 = i; // copy initialization or 
int y2(i); // direct initialization 
double d = (int)i; // explicit cast 
Problemi correlati