2010-08-11 16 views
8

Se una classe ha un costruttore di argomento singolo, la mia comprensione è che è implicitamente convertibile dal costruttore nel tipo dell'argomento nei contesti appropriati. La definizione di un operatore di conversione rende anche una classe convertibile in un altro tipo. Domandeoperatore di cast sovraccaricato o costruttore di argomenti singoli

  • L'operatore di conversione viene mai chiamato implicitamente?
  • Se un costruttore di argomento singolo e un operatore di conversione con lo stesso tipo sono definiti per una classe, uno ha la precedenza sull'altro o è ambiguo?
  • Se hai deciso di volere che una classe sia convertibile in un determinato tipo, quale approccio è migliore o dovresti fornire entrambi?

Edit:

vedo non ho capito chiaramente la direzionalità e che i due eseguire conversioni in direzioni opposte. Come seguito su

  • Se si ha il controllo su due classi che si desidera rendere convertibili l'una dall'altra c'è un modo preferito in termini di queste due operazioni per raggiungere questo obiettivo?
  • È possibile contrassegnare l'operatore di conversione come esplicito?

risposta

3

No, se una classe ha un solo costruttore argomento è implicitamente convertibile dal il tipo del suo argomento.

Per quanto riguarda le vostre altre domande:

  • Condivide l'operatore di cast mai ottenere chiamato implicitamente?

Sì, quando è necessario.

  • Se un costruttore di argomento singolo e un operatore di cast con lo stesso tipo sono definiti per una classe, uno ha la precedenza sull'altro o è ambiguo?

Non sono molto chiaro cosa stai chiedendo, ma se una conversione potrebbe andare in entrambi i casi, è ambigua.

  • Se hai deciso di voler convertire una classe in un determinato tipo, quale approccio è migliore o dovresti fornire entrambi?

Devi usare un cast - i costruttori non lo fanno.

In generale, se non si desidera che le conversioni automatiche da una classe ad altri tipi (e soprattutto non lo si faccia), è meglio fornire funzioni di conversione denominate (ToString, ToInt, ToX) che non verranno mai chiamate automaticamente dal compilatore.

che porta ai vostri altre due domande:

  • Se hai il controllo su due classi che si desidera rendere convertibile da e per l'altro c'è un modo preferito in termini di queste due operazioni da compiere Questo?

Sì, ha utilizzato una funzione con nome per eseguire almeno una delle conversioni. std :: string fa questo - c'è una conversione da un char * a una stringa usando un costruttore, ma nell'altro modo è necessario usare la funzione c_str() chiamata.

  • È possibile contrassegnare l'operatore di conversione come esplicito?

Sfortunatamente, no.

7

Questi due sono opposti: non esplicito costruttore un argomento consente conversione automaticaal il tipo di classe da tipo di argomento. L'operatore di conversione consente la trasmissione implicita dal il tipo di classe.

La saggezza comune è di evitare entrambi, se non specificamente richiesto.

+3

+1: * evitare entrambi * –

+2

Suggerite che std :: string non dovrebbe avere una conversione implicita da const char *? Ciò renderebbe la classe molto più difficile da usare. –

+1

No, non sto dicendo questo. Ma ho visto molte volte persone che definiscono operatori di conversione sulle proprie classi di stringhe, quindi si sorprendono che '+' non è sempre concatenazione, ma aritmetica del puntatore. –

2

se si ha il controllo su due classi che si desidera rendere convertibili da e verso l'altro c'è un modo preferito in termini di queste due operazioni per realizzare questo?

mi piacerebbe scrivere un uno-argomento, esplicito costruttore.

Ho visto troppe sorprese davvero brutte quando si concedono conversioni implicite, quindi li rifiuto sempre. La scrittura di f(A(b)) non è molto più difficile della scrittura di f(b) e offre al compilatore molte più possibilità di fornire messaggi di errore significativi quando il diritto f() non è incluso nella portata.

Problemi correlati